簡體   English   中英

PredicateBuilder 不適用於 EF Core

[英]PredicateBuilder is not working on EF Core

public string[] FindAssets2()
{
    string[] result;

    using (var ctx = new StockContext())
    {
        var predicate = PredicateBuilder.New<Asset>().Or(asset => asset.Symbol.Contains("TSLA"));

        result = ctx.Assets.AsExpandable()
        .Where(predicate)
        .Select(z => z.Symbol)
        .ToArray();
    }

    return result;
}

只是一段簡單的代碼。 它把我扔了

Exception: Unhandled expression type: 'Extension'
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.ExpressionVisitor.VisitExpressionList(ReadOnlyCollection<Expression> original)
LinqKit.ExpressionVisitor.VisitMethodCall(MethodCallExpression m)
LinqKit.ExpressionVisitor.Visit(Expression exp)
LinqKit.Extensions.Expand(Expression expr)
LinqKit.ExpandableQueryProvider<T>.System.Linq.IQueryProvider.CreateQuery<TElement>(Expression expression)
System.Linq.Queryable.Where<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)

下面是我安裝的package

    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0-preview.4.20220.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0-preview.4.20220.10" />
    <PackageReference Include="LINQKit.Core" Version="1.1.17" />

任何幫助將不勝感激。 非常感謝!

似乎 EF-core 5 與AsExpandable配合得不好。 或者說反過來。 它與 EF3 一起工作,但顯然 Linqkit 對特定於庫的表達式樹特性沒有彈性。

這種情況有一個解決方法。 正如這里所解釋的, predicate不是一個Expression ,而是一個ExpressionStarter ,它隱式轉換為Expression<Func<T, bool>>Func<T, bool> 因此,在頂級實體(例如:EF 的IQueryables )上使用謂詞的查詢在沒有AsExpandable的情況下工作:

result = ctx.Assets   // No '.AsExpandable()'
    .Where(predicate) // Implicit conversion of 'predicate' to Expression<Func<Asset,boo>l>
    .Select(z => z.Symbol)
    .ToArray();

壞消息是,如果在這方面沒有任何修復,您將無法在真正需要時使用AsExpandable ,例如集合導航屬性的謂詞。

暫無
暫無

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

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