.net 从SQL Server到实体框架的函数导入运行时异常

.net 从SQL Server到实体框架的函数导入运行时异常,.net,sql-server,entity-framework,linq-to-entities,.net,Sql Server,Entity Framework,Linq To Entities,我试图将数据库中的一个存储过程映射到EF上的一个函数,以便使用LINQ在代码中构建查询 我的存储过程返回/选择一个整数值(两个都尝试过,没有区别)。我可以映射到函数中,并在代码中看到它(使用正确的输入/输出类型),但每当我尝试执行查询时,都会出现以下异常: LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.Nullable`1[System.Int32]] Hammi

我试图将数据库中的一个存储过程映射到EF上的一个函数,以便使用LINQ在代码中构建查询

我的存储过程返回/选择一个整数值(两个都尝试过,没有区别)。我可以映射到函数中,并在代码中看到它(使用正确的输入/输出类型),但每当我尝试执行查询时,都会出现以下异常:

LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.Nullable`1[System.Int32]] HammingDistance(System.Nullable`1[System.Int64], System.Nullable`1[System.Int64])' method, and this method cannot be translated into a store expression.
导致错误的LINQ如下所示:

db.HammingDistance(targetPhoto.Analysis.Hash,p.Analysis.Hash).FirstOrDefault().Value<10

它位于
where
子句中。如果没有此部分,查询运行时不会出现问题

是的,我的称为HammingDistance的过程接受两个long并返回一个int。
我尝试将其创建为sql server函数,而不是存储过程,但随后我无法将其作为函数导入,这正是我想要的。我有一些复杂的查询涉及到这个过程(并且在ManagementStudio上进行了测试,它确实可以正常工作并正确返回值),DB或代码上都没有空值,这不是问题。我已经仔细检查了我的过程是否存在,并在错误发生后继续工作,并且没有对SQL代码进行任何更改。但林克并不认识到这一点。最后,是的,我需要在SQL Server上运行它,我无法处理从DB中提取所有字段并在ASP.NET上运行。我知道这是可以做到的,我很确定这是一个配置问题,因为我的数据库、网站和LINQ查询在不调用HammingDistance的情况下都能完美运行,但我无法将它们绑定在一起。

您不能调用存储过程从LINQ到实体查询。这与直接使用SQL时相同-不能将存储过程调用作为SQL SELECT的一部分。您必须创建SQL函数,然后将HammingDistance转换为标量函数,然后创建一个存储过程来执行选择或创建视图

您可以将其中任何一个导入到模型中,并以这种方式恢复实体


或者,创建一个视图,为汉明距离添加一个新的计算列,然后您可以在where子句中使用该列-位它将向实体添加一个额外属性。

您不能在SQL中作为where子句的一部分执行存储过程。如果查询要映射到SQL,我不知道实体框架将如何解决这个问题。这在技术上应该是可能的。所有查询都将转换为SQL查询以针对数据库运行,并且该过程位于数据库中,正好位于我希望它运行的位置。应该在某个地方有一个映射,即使我的实现是错误的,也应该这样做。我将对此进行研究。但这在技术上应该是可能的。所有查询都将转换为SQL查询以针对数据库运行,并且该过程位于数据库中,正好位于我希望它运行的位置。应该有一个映射的地方,即使我的实现是错误的,它应该做。不,它不应该。只需打开ManagementStudio并从StoredProcedre(x,y)所在的表中运行
SELECT*
——您将得到一个错误。不存在在linq中使用存储过程到实体的映射,并且对您描述的问题(汉明距离)使用存储过程是错误的。您应该了解存储过程和SQL函数之间的区别。我查看了链接,实现了一个具有EdmFunction属性的函数,每当执行它时,它都会抛出一个NotSupportedException,表示“无法创建[name of my database context class]类型的常量值。只能创建基元类型在此上下文中支持('如Int32、String和Guid')尝试用谷歌搜索错误,但到目前为止没有发现任何对我的场景有用的东西。好吧,非常奇怪,当我创建扩展方法时,函数抛出了错误,我创建了一个常规方法,它成功了。非常奇怪,不知道为什么会发生这种情况,可能与属性有关。我做了第一个选项,现在我正在尝试映射fu使用第一个答案中的链接的操作。对于视图选项,是的,但我从未使用过视图,因此运行函数更适合我的问题。这很公平。正如你所知-这是我使用的方法,效果很好。我也会研究它,因为我需要,至少要学会使用视图。B但是我想我首先需要分析什么是EF查询,以及在我返回的视图中包含什么。