tom*_*tom 3 c# linq linq-to-entities entity-framework predicate
我想编写如下代码 -
public IQueryable<Invoice> InvoiceFilterForMonthAndYear(DateTime? monthAndYear = null)
{
var invoices = _invoices.Where(MonthAndYearPredicate(monthAndYear);
return invoices;
}
private bool MonthAndYearPredicate(Invoice invoice, DateTime? monthAndYear)
{
//code to check if the invoice start or end dates is from the falls in the month I am checking for
}
Run Code Online (Sandbox Code Playgroud)
但是我不能使用这样的谓词,因为该谓词只需要一个参数。
我知道我可以写一个 Where 子句InvoiceFilterForMonthAndYear来完成这项工作,但我想将比较的逻辑放入它自己的方法中。
如果您的比较方法返回一个表达式,它会起作用:
private Expression<Func<Invoice,bool>> MonthAndYearPredicate(
DateTime? monthAndYear)
{
return i => i.StartDate >= monthAndYear; // or whatever
}
Run Code Online (Sandbox Code Playgroud)
在你的例子中被调用:
var invoices = _invoices.Where(MonthAndYearPredicate(monthAndYear));
Run Code Online (Sandbox Code Playgroud)
或者您可以将逻辑提取到以下扩展方法中IQueryable<Invoice>:
public static class QueryExtensions
{
public static IQueryable<Invoice> WhereMonthAndYear(
this IQueryable<Invoice> query, DateTime? monthAndYear)
{
return query.Where(i => i.StartDate >= monthAndYear); // or whatever
}
}
Run Code Online (Sandbox Code Playgroud)
被这样称呼:
var invoices = _invoices.WhereMonthAndYear(monthAndYear);
Run Code Online (Sandbox Code Playgroud)
请记住,在这两种情况下,您都必须使用 EF 可以转换为 SQL 的有效 LINQ-to-Entities 表达式。它只会使表达式可重用于不同的查询,但不会扩展其功能。
| 归档时间: |
|
| 查看次数: |
5113 次 |
| 最近记录: |