簡體   English   中英

使用動態屬性過濾linQ c#

[英]Filter in linQ c# with dynamic properties

我有一個屬性列表

string[] strings =
{
    "State", "Name","Location"
};

它們都在Test對象中,類型為字符串,我需要首先循環拋出它們並在屬性等於“OK”時過濾數據

這是我的代碼片段

for (int x=0;x<strings.Length;x++)
{
    // PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(Test)).Find(strings[x],true);                                               

    var miss = _unityOfWork.TestRepository.Get(i =>
                   i.GetType().GetProperty(strings[x]).Equals("OK") )
                   .Select().toList()

此代碼返回以下異常:

“LINQ to Entities無法識別方法'System.Reflection.PropertyInfo GetRuntimeProperty(System.Type,System.String)'方法,而且此方法無法轉換為商店表達式。”

我需要使用屬性名稱從數組中過濾列表

以下是我可能會這樣做...簡單明了,沒有反射,並且開關有兩個功能:(1)防范未知區域,(2)為每種情況應用適當的條件。

var strings = new[] { "State", "Name", "Location" };

var result = _unityOfWork.TestRepository.GetAll().AsQueryable();
// you may need to tweak the above before it works

foreach (var field in strings)
{
    switch (field)
    {
        case "State":
            result = result.Where(x => x.State == "OK");
            break;
        case "Name":
            result = result.Where(x => x.Name == "OK");
            break;
        case "Location":
            result = result.Where(x => x.Location == "OK");
            break;
    }
}

return result;   // if needed, add .ToList() or .ToArray() 

您可以執行以下操作:

public string ValidateProperty<T>(T parameter)
{
     var properties = typeof(...).GetProperties();
     foreach(var property in properties)
          if(property == parameter)
              return "OK";

     return "FAIL";
}   

var content = collection.Get().Where(property => ValidateProperty(property.Name.Value) == "OK" && ValidateProperty(property.State.Value) == "OK");

沒有時間檢查語法,但這應該允許你比較所有。 陷阱是,它會在每次調用時生成一個PropertyInfo數組。 一個想法或一個不同的方法,不知道它對你的實現是多么可行。

由於OP表明屬性始終相同,請嘗試以下操作:

var miss = _unitOfWork.TestRepository
                      .Where(m => m.State == "OK" || m.Name == "OK" || m.Location == "OK");

你可以這樣做(不確定確切的語法,但想法):

var miss = _unityOfWork.TestRepository.Get()

                   .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK"))
                   .toList()

編輯:正確的選擇將是這樣的

var miss = _unityOfWork.TestRepository
                .ToList()
                .Where(i => i.GetType().GetProperty(strings[x]).Equals("OK"))
                .toList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM