将比较函数和值作为参数传递到Entity Framework

时间:2014-11-13 04:39:58

标签: entity-framework

这是关于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查询。我的问题是:我如何将它们作为参数传递?

2 个答案:

答案 0 :(得分:0)

此问题意味着您的LINQ查询无法转换为适当的SQL查询以进行后端执行。所有LINQ to SQL或实体框架查询都会转换为在后端运行的SQL,如果它们有一些操作无法执行转换为SQL可能会出现此错误。

我认为您首先应该使用.ToList()或.AsEnumerable()将数据存入内存,然后使用&#39; Op&#39;对此的操作。那应该解决问题

答案 1 :(得分:0)

不幸的是,你无法使用LinqToEntities。您必须手动创建SQL查询或调用数据库函数...