簡體   English   中英

當應用於IQueryable時,Expression.Constant丟棄現有的WHERE條件<T>

[英]Expression.Constant discarding existing WHERE conditions when applied to IQueryable<T>

語境

我有一個IQueryable擴展方法GetAllGroupedBy ,該方法應該通過EF Core解決MySQL上的每組最大n個問題。

基本上它構造了這種類型

public struct OrderedGroupItem<TModel, TKey>
{
    public TKey GroupKey { get; set; }
    public int OrderKey { get; set; }
    public TModel Value { get; set; }
}

通過對表中的每個元素進行內部計數,以給定順序對該元素下的元素計數。

該代碼長100行,可以在這里找到。

問題

在擴展方法中傳遞IQueryable<T>查詢時,調試器將顯示:

value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Persistence.Models.Project])
        .Where(...)

因為擴展方法是這樣調用的:

query.Where(...).GetAllGroupedBy(...);

因此傳入的query正確存儲了GetAllGroupedBy調用之前的Where(...)部分。

但是,當我通過Expression.Constant(query)將其放入表達式中時,得到的表達式是:

{
    new OrderedGroupItem`2() 
    {
        GroupKey = Invoke(x => x.GroupKey, x), 
        OrderKey = value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Type])
            .Where(y => 
                (Invoke(x => x.GroupKey, x) 
                    == Invoke(x => x.GroupKey, y))
            )
            .Where(y => 
                Invoke((x, y) => 
                    (
                        (Compare(x.OrderValue, y.OrderValue) < 0) 
                        OrElse (
                            (Compare(x.OrderValue, y.OrderValue) == 0) 
                            AndAlso (x.Id < y.Id)
                        )
                    ), 
                    x, 
                    y
                )
            ).Count(), 
        Value = x
    }
}

並且翻譯后的SQL不會重復原始的.Where(...)過濾器。

為什么Expression.Constant(queryable)刪除存儲在queryable中的.Where(...)條件? 我究竟做錯了什么?

代替:

Expression.Constant(query)

您應該使用:

query.Expression

暫無
暫無

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

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