[英]Applying an Expression<> to a LINQ Where clause
我正在編寫一個自定義實體框架過濾器。 我有一個 ID 列表和一個用戶提供的表達式。
protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;
現在我的問題是如何將Filter
表達式應用於Where()
子句?
public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
if (FilterMode == FilterModeMatchAny && HasFilterIds)
{
// Whoops! Can't do this!
return query.Where(x => Filter(x, FilterIds));
}
return query;
使用這篇文章中的Combine
方法幾乎可以滿足您的所有需求。 從那里你只需要將文字值轉換為計算它的表達式(或者我想改變該答案的Combine
方法,以便中間值不是從 lambda 計算出來的,而是任何表達式),然后調用function。
protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>> FilterIdsExpression => _ => FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;
public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
if (FilterMode == FilterModeMatchAny && HasFilterIds)
{
return query.Where(FilterIdsExpression.Combine(Filter));
}
return query;
}
您可以創建一個新表達式以使用FilterIds
調用Filter
並使用來自LinqKit的Expand
編輯感謝@Servy 的評論。 現在我只擴展內部表達式而不是整個查詢。
...
protected IEnumerable<TColumn> FilterIds;
protected Expression<Func<T, IEnumerable<TColumn>, bool>> Filter;
public virtual IQueryable<T> ApplyFilter(IQueryable<T> query)
{
if (FilterMode == FilterModeMatchAny && HasFilterIds)
{
Expression<Func<T, bool>> expression = x => Filter.Invoke(x, FilterIds);
return query.Where(expression.Expand());
}
return query;
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.