簡體   English   中英

將 Expression<> 應用於 LINQ Where 子句

[英]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並使用來自LinqKitExpand

編輯感謝@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.

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