带有动态属性的linqc#过滤器
本文关键字:linqc# 过滤器 属性 动态 | 更新日期: 2023-09-27 18:18:13
我有一个属性列表
string[] strings =
{
"State", "Name","Location"
};
它们都在字符串类型的测试对象中,我需要先循环抛出它们,并在属性等于"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到实体无法识别方法'System. reflection . propertyinfo '类型,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()