我已经看到围绕这个主题的许多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,但我不确定如何实际解决这个问题。任何帮助,将不胜感激。
干杯,詹姆斯。
答案 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;