Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用.net函数筛选实体框架信息_.net_Linq_Entity Framework 4.1 - Fatal编程技术网

使用.net函数筛选实体框架信息

使用.net函数筛选实体框架信息,.net,linq,entity-framework-4.1,.net,Linq,Entity Framework 4.1,我有不同的函数,它们有数学方法,还有一些函数有字符串处理方法,例如:integrautils.RegionalArea(双x,双y) 和StringUtils.RabinKarp(字符串x) 我使用的是Entity Framework 4.1,当我想在Linq查询的筛选器部分中使用此类函数时,出现了一个错误,即没有此类等效函数: var res = from item in Items where IntegralUtils.RegionalArea(item.X, ite

我有不同的函数,它们有数学方法,还有一些函数有字符串处理方法,例如:integrautils.RegionalArea(双x,双y) 和StringUtils.RabinKarp(字符串x)

我使用的是Entity Framework 4.1,当我想在Linq查询的筛选器部分中使用此类函数时,出现了一个错误,即没有此类等效函数:

var res = from item  in Items
          where IntegralUtils.RegionalArea(item.X, item.Y)
          select item;
我的快速解决方案是在不过滤的情况下获取所有项,在foreach循环中迭代项并使用if表达式过滤,我认为这当然不是最好的解决方案

但我的问题是,我是否可以让entity framework接受这种带有自定义CLR函数的Linq查询,或者我如何做类似的事情


提前感谢

这将非常缓慢,因为它必须从数据库中检索整个表,然后进行筛选,但这正是您想要的:

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;

正如@Robert McKee所指出的,您不能将自己的函数添加到查询中,因为实体框架将您的C#查询转换为SQL,然后在服务器上执行。因为它不知道如何翻译您的RegionalArea方法,所以它失败了

您可以按照Robert的建议执行—将SQL中的所有数据带到流程中(使用
ToList()
方法),然后过滤.NET集合。这会起作用,但如果数据库中有很多项,并且查询最终只返回其中的一小部分,则速度可能会很慢

我不会把你的RegionalArea方法转移到数据库中,那会很快变得非常混乱。相反,如果性能是一个问题,我会在将每个项目添加到数据库时预先计算它们的RegionalArea-只需添加一个
项目。RegionalArea
属性,并在构建项目时用适当的值填充它。然后查询就变得微不足道了


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

谢谢你,罗伯特,我在考虑这个问题,这可能是一种选择,但我正在阅读谓词builer的文章,我不知道这是否有助于加快速度,或者,最好的方法是您提到的方法?谓词生成器不会帮助您提高性能,除非您在SQL Server上安装了Integratutils库。在SQL Server上安装函数后,这可能会对您有所帮助