我有一个包含几百列的表,并且从我的客户端向用于查询该表的服务器传递多个“search”对象。每个搜索对象都包含一个搜索词,以及与之匹配的属性的名称。
我不确定如何在这里使用反射来查询使用EF Core的属性。我试过下面的方法,但它不喜欢。
var prop = <ENTITYTYPE>.GetProperty(search.Property);
query = context.<ENTITY>.Where(x => (string)prop.GetValue(x) == search.SearchTerm);
我在想,我可能必须构造一个原始的SQL查询,但我很想知道是否有一种方法可以拼凑它,这样EF Core就可以自己创建查询。当我在上面执行.ToList()
时,它告诉我查询不能被翻译。
任何帮助都将不胜感激!
发布于 2021-09-07 06:52:31
这是基本的认识,应该会把你推向正确的方向:
public static IQueryable<T> AddFilter<T>(IQueryable<T> query, string propertyName, string searchTerm)
{
var param = Expression.Parameter(typeof(T), "e");
var propExpression = Expression.Property(param, propertyName);
object value = searchTerm;
if (propExpression.Type != typeof(string))
value = Convert.ChangeType(value, propExpression.Type);
var filterLambda = Expression.Lambda<Func<T, bool>>(
Expression.Equal(
propExpression,
Expression.Constant(value)
),
param
);
return query.Where(filterLambda);
}
发布于 2021-09-07 06:40:35
不推荐使用,请参阅我尝试过的以下示例的评论,它对我有效
private void Test()
{
Type myType = typeof(AktivEvents);
PropertyInfo myPropInfo = myType.GetProperty("AutoReplyMessage");
Func<AktivEvents, bool> func = (e) => (string)myPropInfo.GetValue(e) == "asdasd";
var query = _dbService.AktivEvents.GetAll()
.Where(func)
.ToList();
}
它显然是肮脏的,但这个想法是可行的,并依赖于
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
https://stackoverflow.com/questions/69089624
复制