gpt4 book ai didi

asp.net-core - 如何使用方法在 Entity Framework Core 中的属性上添加过滤器?

转载 作者:行者123 更新时间:2023-12-02 18:13:18 25 4
gpt4 key购买 nike

我需要有条件地向查询中的特定日期添加过滤器。有共同的前提条件并且过滤器将是相同的。因此,我希望通用代码位于可以执行这些检查的方法中,然后让消费者传入应应用过滤器的属性(可以应用于多个)。

这是我的代码的简化版本。

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;
}

当我在 SQL 探查器中查看查询时,我可以看到该查询缺少 WHERE 子句(因此正在检索所有文档并在内存中完成过滤)。如果我复制/粘贴两个日期的内联代码(而不是调用该方法两次),则两个日期的 WHERE 子句都将包含在查询中。

是否没有办法通过传递 Func 中的属性来向 IQueryable 添加 WHERE 条件,而该属性可以由 Entity Framework 正确转换为 SQL?

最佳答案

EF 无法理解您的查询,因此它会中断并在内存中执行 WHERE 子句。

解决方案是创建动态表达式。

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;
}

抱歉,我自己没有运行过这个,但这应该创建 WHERE 语句。让我知道进展如何。

关于asp.net-core - 如何使用方法在 Entity Framework Core 中的属性上添加过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48885243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com