Dav*_*nce 3 entity-framework-core asp.net-core
我需要在查询中有条件地添加过滤器到特定日期.有共同的先决条件,过滤器将是相同的.因此,我希望公共代码位于一个方法中,该方法可以执行这些检查,然后让消费者传入应该应用过滤器的属性(可以应用于多个).
这是我的代码的简化版本.
var query = dbContext.Documents.AsQueryable();
query = FilterDocumentsByDate(query, x => x.CreatedDate);
query = FilterDocumentsByDate(query, x => x.SubmittedDate);
private IQueryable<Document> FilterDocumentsByDate(IQueryable<Document> query, Func<Document, DateTime> propertyToSearch)
{
query = query.Where(x => propertyToSearch(x).Year > 2000);
return query;
}
Run Code Online (Sandbox Code Playgroud)
当我在SQL profiler中查看查询时,我可以看到查询缺少WHERE子句(因此正在检索所有文档并且过滤器正在内存中完成).如果我为两个日期内联复制/粘贴代码(而不是两次调用该方法),那么两个日期的WHERE子句都包含在查询中.
是否无法通过在Func中传递属性来向IQueryable添加WHERE条件,该属性可以通过Entity Framework正确转换为SQL?
EF is unable to understand your query, so it breaks and executes WHERE
clause in memory.
The solution is creating dynamic expressions.
var query = dbContext.Documents.AsQueryable();
query = FilterDocumentsByDate(query, x => x.CreatedDate.Year);
query = FilterDocumentsByDate(query, x => x.SubmittedDate.Year);
private IQueryable<Document> FilterDocumentsByDate(IQueryable<Document> query, Expression<Func<Document, int>> expression)
{
var parameter = expression.Parameters.FirstOrDefault();
Expression comparisonExpression = Expression.Equal(expression.Body, Expression.Constant(2000));
Expression<Func<Document, bool>> exp = Expression.Lambda<Func<Document, bool>>(comparisonExpression, parameter);
query = query.Where(exp);
return query;
}
Run Code Online (Sandbox Code Playgroud)
I am sorry, I haven't run this myself, but this should create WHERE statement. Let me know how it goes.
归档时间: |
|
查看次数: |
125 次 |
最近记录: |