使用动态属性

时间:2016-11-15 15:52:05

标签: c# entity-framework linq 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()

此代码返回以下异常:

  

&#34; LINQ to Entities无法识别方法&#39; System.Reflection.PropertyInfo GetRuntimeProperty(System.Type,System.String)&#39;方法,并且此方法无法转换为商店表达式。&#34;

我需要使用数组属性名称来过滤列表

4 个答案:

答案 0 :(得分:1)

以下是我可能会这样做...简单明了,没有反射,并且开关有两个功能:(1)防范未知领域,(2)为每种情况应用适当的条件。 / p>

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() 

答案 1 :(得分:0)

您可能会执行以下操作:

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数组。一个想法或一个不同的方法,但不确定它对你的实现是否可行。

答案 2 :(得分:0)

由于OP表明属性始终相同,请尝试:

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

答案 3 :(得分:-1)

你可以这样做(不确定确切的语法,但想法):

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()