簡體   English   中英

實體框架中的LINQ謂詞

[英]LINQ predicate in Entity Framework

我想調用方法

 query.Range(item => item.Date, filter.Date);

並有方法:

 public static IQueryable<T> Range<T>(this IQueryable<T> query, Func<T, DateTime> func, DateTime range)
    {
       return query.Where(item=> func(item) <= range); // <<-- Error "func(item)"
    }

錯誤: LINQ to Entities不支持LINQ表達式節點類型'Invoke'。

如何使用功能?

當你寫

return query.Where(item => func(item) <= range);

然后lambda item => func(item) <= range不是簡單的lambda-將其轉換為Expression<Func<T,bool>> 在執行查詢時,EF嘗試將此類表達式轉換為SQL代碼。 不幸的是,它不知道在純SQL中應該如何表示func調用。 因此,您會看到此錯誤。 而且,您不能在傳遞給EF的表達式中使用委托調用。

解決方法:代替

query.Range(item => item.Date, filter.Date)

使用簡單(在這種情況下,它也更具可讀性)

query.Where(item => item.Date <= filter.Date)

更新:您可以手動構建日期過濾器表達式:

public static IQueryable<T> Range<T>(this IQueryable<T> query,
    Expression<Func<T, DateTime>> func, DateTime range)
{            
    var predicate = 
        Expression.Lambda<Func<T, bool>>(
            Expression.LessThanOrEqual(func.Body, Expression.Constant(range)),
            func.Parameters.Single());

    return query.Where(predicate);
}

您可以使用更通用的方法。

    public IQueryable<T> Filter<T>(Expression<Func<T, bool>> predicate) where T : class
    {
        return db.Set<T>().Where<T>(predicate).AsQueryable<T>();
    }

並稱之為:

query.Filter<MyClassIWantToFetch>(item => item.Date <= filter.Date)

並且不要忘記將MyClassIWantToFetch更改為想要獲取的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM