C# 将基于属性名称和值的筛选器表达式转换为Linq Where子句Func<;T、 bool>;?
我想创建一个方法,该方法将根据用户传递给我的方法的属性名和值过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新类型的数据类来扩展它。请参见代码我的意思:C# 将基于属性名称和值的筛选器表达式转换为Linq Where子句Func<;T、 bool>;?,c#,linq,lambda,expression,func,C#,Linq,Lambda,Expression,Func,我想创建一个方法,该方法将根据用户传递给我的方法的属性名和值过滤我的数据。不幸的是,我无法更改代码使用的接口,我只是通过创建一种新类型的数据类来扩展它。请参见代码我的意思: public interface IService{ Task<IEnumerable<T>> GetCollection<T>(string name, string fieldPath, string value) } public class MockService : I
public interface IService{
Task<IEnumerable<T>> GetCollection<T>(string name, string fieldPath, string value)
}
public class MockService : IService
{
MockDb _db = new Mock();
public async Task<IEnumerable<T>> GetCollection<T>(string fieldPath, string value)
{
Func<T, bool> func = <WHAT CODE IS REQUIRED HERE BASED ON THE FIELD PATH AND VALUE?>;
return _db.GetTable<T>(func);
}
}
公共接口iSeries设备{
任务GetCollection(字符串名称、字符串字段路径、字符串值)
}
公共类MockService:iSeries
{
MockDb_db=new Mock();
公共异步任务GetCollection(字符串字段路径,字符串值)
{
Func Func=;
返回_db.GetTable(func);
}
}
数据类:
public class MockDb{
public List<T> GetTable<T>(Func<T, bool> func){
return somecollection.Where(func).ToList();
}
}
公共类MockDb{
公共列表可获取(Func Func){
返回somecollection.Where(func.ToList();
}
}
如何将输入转换为筛选器,即fieldPath和value转换为Func?这里有一个简单的方法,假设fieldPath是属性的名称,值是字符串类型:
public async Task<IEnumerable<T>> GetCollection<T>(string fieldPath, string value)
{
return _db.GetTable<T>(t=> ((string) t.GetType().GetProperty(fieldPath).GetValue(t)) == value);
}
公共异步任务GetCollection(字符串字段路径,字符串值)
{
返回_db.GetTable(t=>((字符串)t.GetType().GetProperty(fieldPath.GetValue(t))==value);
}
对于更通用和更复杂的解决方案,您应该按照Jonathan Barclay的建议使用表达式。似乎您正在使用实体框架,在这种情况下,您应该使用可转换为SQL的
表达式。表达式可以动态构建;这里可以找到一个例子:本例中没有,但我以前使用过表达式。这只是一个静态对象的模拟数据库。不过,非常感谢。对字符串的转换是不必要的;您可以只使用Equals
:t=>t.GetType().GetProperty(fieldPath).GetValue(t).Equals(value)
。