[英]How to link two expressions with Any to formulate an EF Core query
我正在嘗試為 EF Core 查詢的條件制定表達式。 到目前為止,我所擁有的是將我的查詢結果類型轉換為IEnumerable
的表達式和將其轉換為bool
的IEnumerable
類型的謂詞。 現在我想將它們與任何條件聯系起來。 到目前為止我正在嘗試的是:
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。
我想這是因為我嘗試使用Func
的Expression
而不是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.