簡體   English   中英

如何將兩個表達式與 Any 鏈接以制定 EF Core 查詢

[英]How to link two expressions with Any to formulate an EF Core query

我正在嘗試為 EF Core 查詢的條件制定表達式。 到目前為止,我所擁有的是將我的查詢結果類型轉換為IEnumerable的表達式和將其轉換為boolIEnumerable類型的謂詞。 現在我想將它們與任何條件聯系起來。 到目前為止我正在嘗試的是:

public static Expression<Func<TIn, bool>> Any<TIn, T>(
        Expression<Func<TIn, IEnumerable<T>>> valueFunction,
        Expression<Func<T, bool>> predicate)
{
    var call = Expression.Call(typeof(Queryable), nameof(Queryable.Any), new[] { typeof(T) }, value, predicate);
    return Expression.Lambda<Func<TIn, bool>>(call);
}

這會引發以下異常:

System.InvalidOperationException:在類型“System.Linq.Queryable”上沒有通用方法“Any”與提供的類型 arguments 和 arguments 兼容。 如果方法是非泛型的,則不應提供類型 arguments。

我想這是因為我嘗試使用FuncExpression而不是ParameterExpression來調用Any方法。

所以我的問題是,是否有可能做到這一點,如果可以,怎么做? 先感謝您!

嘗試這個:

public static Expression<Func<TIn, bool>> Any<TIn, T>(
           Expression<Func<TIn, IEnumerable<T>>> valueFunction,
           Expression<Func<T, bool>> predicate)
{
    var method = typeof(Enumerable).GetMethods()
        .Where(mi => mi.Name =="Any" && mi.GetParameters().Length == 2)
        .Single()
        .MakeGenericMethod(typeof(T));
    var call = Expression.Call(method, valueFunction.Body, predicate);
    return Expression.Lambda<Func<TIn, bool>>(call, valueFunction.Parameters);
}

所以你在這里幾乎沒有問題。 首先,您的選擇器表達式返回IEnumerable ,因此您需要從Enumerable獲取方法(如果您需要處理IQueryable ,則需要做更多的工作,例如檢查valueFunction.Body.Type以實現IQueryable )。 然后你需要 select 正確的方法,因為Any是通用的 - 你需要為類型參數設置特定的類型,從而創建一個 MethodInfo object 代表一個特定的構造方法( MakeGenericMethod )。 最后將valueFunction.Body用於Call arguments 之一。

暫無
暫無

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

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