2 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個贊
問題類似于無法轉(zhuǎn)換基本屬性的 LINQ 表達(dá)式和如何在 EF Core 表達(dá)式中使用繼承的屬性?,但在這種情況下, 和DeclaringType
都ReflectedType
指向MemberInfo
接口ISomeable
而不是實(shí)際的類。
這又在某種程度上讓場景中的 EF Core 感到困惑Select
。我檢查了最新的 EF Core 3.0 預(yù)覽版,它也不起作用。您可以考慮將其發(fā)布到他們的問題跟蹤器。
到目前為止,我可以提供的唯一解決方法是使用自定義后處理表達(dá)式ExpressionVisitor
并將成員訪問器綁定到實(shí)際的類。像這樣的東西:
public static partial class ExpressionUtils
{
? ? public static Expression<T> FixMemberAccess<T>(this Expression<T> source)
? ? {
? ? ? ? var body = new MemberAccessFixer().Visit(source.Body);
? ? ? ? if (body == source.Body) return source;
? ? ? ? return source.Update(body, source.Parameters);
? ? }
? ? class MemberAccessFixer : ExpressionVisitor
? ? {
? ? ? ? protected override Expression VisitMember(MemberExpression node)
? ? ? ? {
? ? ? ? ? ? if (node.Expression != null && node.Expression.Type != node.Member.DeclaringType)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var member = node.Expression.Type.GetMember(node.Member.Name).Single();
? ? ? ? ? ? ? ? if (member.ReflectedType != member.DeclaringType)
? ? ? ? ? ? ? ? ? ? member = member.DeclaringType.GetMember(member.Name).Single();
? ? ? ? ? ? ? ? return Expression.MakeMemberAccess(node.Expression, member);
? ? ? ? ? ? }
? ? ? ? ? ? return base.VisitMember(node);
? ? ? ? }
? ? }
}
現(xiàn)在
var someCriteria2 = GetCriteria<MySimpleEntity>().FixMemberAccess();
將生成與工作編譯時表達(dá)式完全相同的表達(dá)式someCriteria,并且沒有客戶端評估。
注意:您仍然需要約束class,以避免上一個問題中的轉(zhuǎn)換問題并使此解決方法發(fā)揮作用。

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個贊
我認(rèn)為你的代碼的問題是
GetCriteria<MySimpleEntity>();
linq
無法直接翻譯sql
或沒有直接翻譯。如果你想使用它。執(zhí)行ToList()
然后添加.Where(someCriteria2).ToList();
. 在觀察者中,它認(rèn)為/評估它是相同的。但在查詢本身中,生成 sql 似乎并不是這樣工作的。
我還經(jīng)歷過,在我的DateTime
擴(kuò)展方法中,即使將其轉(zhuǎn)換為string
我的擴(kuò)展Where
方法,我也必須在linq
查詢之外執(zhí)行它并添加它
var dateUtc = DateTime.UtcNow.ExtensionMethod()
;
...Where(x => x.Date >= dateUtc
)
或者我在我的和/或FirstorDefault, First, ToList()
之前先執(zhí)行select
where
- 2 回答
- 0 關(guān)注
- 130 瀏覽
添加回答
舉報(bào)