【问题标题】:"LINQ to Entities does not recognize the method" on IQueryable<T>.WhereIQueryable<T>.Where 上的“LINQ to Entities 无法识别该方法”
【发布时间】:2015-11-10 19:57:18
【问题描述】:

这会编译,但在运行时会引发异常。

using (var edmx = new MyEDMX())
{
    Expression<Func<SearchResult, int, bool>> pred = (sr, idx) =>
            sr.Foo >= searchParams.MinFoo && sr.Foo <= searchParams.MaxFoo
        ;
    return edmx.SearchResults.Where(pred).ToList();
}

例外是System.NotSupportedException:

LINQ to Entities 无法识别方法 'System.Linq.IQueryable`1[MyNamespace.SearchResult] 其中[SearchResult](System.Linq.IQueryable`1[MyNamespace.SearchResult], System.Linq.Expressions.Expression`1[System.Func`3[MyNamespace.SearchResult,System.Int32,System.Boolean]])' 方法,并且该方法不能翻译成商店表达式。

我认为问题与谓词表达式的Int32 参数有关,因为如果我替换以下谓词,代码在运行时可以完美运行:

Expression<Func<SearchResult, bool>> pred = (sr) =>
        sr.Foo >= this.MinFoo && sr.Foo <= this.MaxFoo
    ;
return edmx.SearchResults.Where(pred).ToList();

如果谓词没有Int32 参数,则会解析为Queryable&lt;TSource&gt;.Where() 的不同重载。它返回正确过滤的结果而不会引发异常。

Int32 版本是 Intellisense 已知的,它为我正在使用的 .NET 版本 .NET 4.5 编译 and it's documented。无论表达式实际上是否对 Int32 idx 参数执行任何操作,我都会得到相同的异常。

通常,“LINQ to Entities 无法识别该方法”意味着您调用的方法在查询被翻译成的任何内容中都没有等效项——在这种情况下为 SQL。

LINQ to SQL 是否不知道如何在 LINQ to SQL 查询上创建行号? EDMX 提供(包装、反射、公开等)SQL Server 视图。

有人猜到这里出了什么问题吗?

我需要做的任何事情都可以使用 Skip/Take 和有效的重载来完成,但我很好奇。

【问题讨论】:

  • 嗯,您已经得到了答案——您使用的 EF 提供程序没有为 Where 的重载实现转换。似乎 SQL 生成会相当复杂,所以有人可能认为这不值得。
  • @jjj 好吧,我希望这可能是我做错了什么明显的事情。当当。

标签: entity-framework linq-to-entities iqueryable


【解决方案1】:

提供的 func 需要 2 个参数,但是,只有一个。下面的代码首先在 SearchResults 上创建了一个匿名类型。匿名类型有搜索结果和索引值。然后我们可以将它传递给 IQueryable;

using (var edmx = new MyEDMX())
{
    var pred = (sr, idx) =>
        sr.Foo >= searchParams.MinFoo && sr.Foo <= searchParams.MaxFoo;
    return edmx.SearchResults
        .Select((v, i) => new {result = v, index = i})
        .Where( w=> pred(w.result, w.index)).ToList();
}

【讨论】:

    猜你喜欢
    • 2021-11-06
    相关资源
    最近更新 更多