这是关于Passing a comparison function as a parameter into Entity Framework的问题的后续行动。
我想将比较函数和值传递给查询Entity Framework的搜索函数。比较函数必须根据值对不同的属性进行操作。例如,我的数据是
class DataItem
{
[Key]
public int ID { get; set; }
public bool Active { get; set; }
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
我需要一个上下文方法
public List<DataItem> SearchValue(Func<string, string, bool> op, string value)
{
if (value.Length < 10)
return DataItem.Where(di => di.Active && op(di.Prop1, value)).ToList();
else
return DataItem.Where(di => di.Active && op(di.Prop2, value)).ToList();
}
然后我可以像那样打电话
List<DataItem> list = context.SearchValue((s1, s2) => s1 == s2, "A");
我还需要不同的比较功能(所有规范)。
程序编译正常,但在运行时,我得到一个&#34; LINQ表达式节点类型&#39; Invoke&#39; LINQ to Entities不支持。&#34;错误。
将DataItems加载到内存中不是一种选择,因为我将拥有大约10亿个。这就是我寻找服务器端解决方案的原因。我使用的所有操作都是规范的,因此可以将它们转换为SQL查询。我的问题是:我如何将它们作为参数传递?
答案 0 :(得分:0)
此问题意味着您的LINQ查询无法转换为适当的SQL查询以进行后端执行。所有LINQ to SQL或实体框架查询都会转换为在后端运行的SQL,如果它们有一些操作无法执行转换为SQL可能会出现此错误。
我认为您首先应该使用.ToList()或.AsEnumerable()将数据存入内存,然后使用&#39; Op&#39;对此的操作。那应该解决问题
答案 1 :(得分:0)
不幸的是,你无法使用LinqToEntities。您必须手动创建SQL查询或调用数据库函数...