![](/img/trans.png)
[英]What does Expression.Quote() do that Expression.Constant() can’t already do?
[英]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.