“按对象排序时,Linq to Entities无法识别方法”

时间:2013-11-28 11:51:19

标签: c# linq entity-framework

我已经看到围绕这个主题的许多SO问题,但我无法找到解决我特定情况的方法,我有以下声明:

return (from Animals in ctx.Animals
                orderby sortStrategy.Sort(Animals)
               descending
                select Animals).AsQueryable();

sortStrategy.Sort只返回我要对Animals进行排序的Object。但是,这会引发以下错误:

'LINQ to Entities无法识别方法'System.Object Sort(AnimalLibrary.Animal)'方法,并且此方法无法转换为商店表达式。'

我相信这是因为Linq不了解如何执行sortStrategy.Sort,但我不确定如何实际解决这个问题。任何帮助,将不胜感激。

干杯,詹姆斯。

3 个答案:

答案 0 :(得分:1)

(这个答案是从评论中提升的。)

如果要将数据提取到内存并在那里进行排序,可能

(from Animals in ctx.Animals.AsEnumerable() /* NB! */
orderby sortStrategy.Sort(Animals) descending
select Animals)

会奏效。

答案 1 :(得分:0)

如评论中所示,这不起作用。当您将查询传递给Linq-To-Entities时,它会将该查询转换为SQL - 它要求您在查询中传递的所有内容都可以按原样转换为SQL - 它不会执行任意C#方法以获取然后它可以嵌入到它生成的SQL中的值。

如果您想按Animal名称订购,则您的查询必须包含order by Animals.Name。如果您想按sortStrategy.Sort的结果排序,则必须执行查询而不进行排序,然后使用Linq-To-Objects对内存中的结果执行排序,或使用Dynamic Linq嵌入字符串查询中sortStrategy.Sort()的结果,然后可以将其转换为表达式。

答案 2 :(得分:0)

您说sortStrategy.Sort会返回Animal的某些属性,因此您可以将策略类重新定义为

class SortStrategy<T>
{
    public Expression<Func<Animal, T>> Sort { get; set; }
}

然后建立你的策略,如

var sortByAgeStrategy = new SortStrategy<int> { Sort = a => a.Age };
var sortByNameStrategy = new SortStrategy<string> { Sort = a => a.Name };

此时您可以选择其中一种策略并调用LINQ,如

IQueryable<Animal> sorted =
    from a in animals
    orderby someSortStrategy.Sort descending
    select a;