1

我有不同的函数,它们具有数学方法,而其他一些函数具有字符串处理方法,例如我拥有的一些函数是:IntegralUtils.RegionalArea(double x, double y) 和 StringUtils.RabinKarp(string x)。

我正在使用 Entity Framework 4.1,当我想在 Linq 查询的过滤器部分中使用这些函数时,出现了一个错误,即没有这样的等效函数:

var res = from item  in Items
          where IntegralUtils.RegionalArea(item.X, item.Y)
          select item;

我的快速解决方案是在不过滤的情况下获取所有项目,并在 foreach 循环中迭代项目并使用 if 表达式进行过滤,我认为这当然不是最好的解决方案。

但我的问题是,如果我可以使实体框架接受这种带有自定义 CLR 函数的 Linq 查询,或者我怎么能做类似的事情?

提前致谢

4

2 回答 2

2

正如@Robert McKee 指出的那样,您不能将自己的函数添加到查询中,因为 Entity-Framework 会将您的 C# 查询转换为 SQL,然后在服务器上执行它。由于它不知道如何翻译您的 RegionalArea 方法,因此它失败了。

您可以按照 Robert 的建议进行操作 - 将 SQL 中的所有数据带到您的进程(使用该ToList()方法),然后过滤 .NET 集合。这会起作用,但如果数据库中有很多项目,则可能会很慢,并且查询最终只返回其中的几个。

我不会将您的 RegionArea 方法转移到数据库,这会很快变得非常混乱。相反,如果性能是一个问题,我会在将它们添加到数据库时预先计算每个项目的区域区域 - 只需添加一个Item.RegionalArea属性并在构建项目时用正确的值填充它。然后查询变得微不足道。

注意:是的,我知道我选择了一些非规范化而不是以前的解决方案。我认为这种非规范化是值得的——在代码和数据库之间拆分逻辑会花费更多。

于 2013-06-13T04:06:40.960 回答
1

这会很慢,因为它必须从数据库中检索整个表,然后它会过滤,但这就是你想要的:

var res=Items.ToList().Where(i=>IntegralUtils.RegionalArea(i.X,i.Y));

如果您更喜欢查询语法,我相信这也可以:

var res=from item  in Items.ToList()
          where IntegralUtils.RegionalArea(item.X, item.Y)
          select item;
于 2013-06-13T02:43:13.537 回答