Select语句中的Entity Framework 6存储函数

Posted

技术标签:

【中文标题】Select语句中的Entity Framework 6存储函数【英文标题】:Entity Framework 6 Stored Function in Select Statement 【发布时间】:2016-10-28 09:32:44 【问题描述】:

我在 LINQ to SQL 中有一个这样的连接查询:

from t in d.MainTable
               join t1 in Db.JoinedTable1 on t.jid1 equals t1.Id into t11
               from t12 in t11.DefaultIfEmpty()
               join t2 in Db.JoinedTable2 on t.jid2 equals t2.Id into t21
               from t22 in t21.DefaultIfEmpty()                   
               select new Dto
               
                   Field1 = t.Field1,
                   Field11 = t12.Name,
                   Field2 = t.Field2,
                   Field3 = Db.Database.SqlQuery<string>("select dbo.f_MyFunction('val', 4)").FirstOrDefault()
               ;

但我得到一个错误:

LINQ to Entities 无法识别方法 'System.Data.Entity.Infrastructure.DbRawSqlQuery`1[System.String] SqlQuery[String](System.String, System.Object[])' 方法,并且此方法不能被翻译成商店表达式。

可以在select语句中使用存储函数吗?或者如何使用属性映射到存储函数的类?

已编辑。我的 DbContext 类中的命名空间用法:

using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Data.SqlClient;
using System.Linq;

【问题讨论】:

你在使用 System.Data.Entity.SqlServer; 吗? 是的,它是一个SqlServer Provider。它在 web.config 中设置: 【参考方案1】:

在this answer 我找到了解决方案。我将 CodeFirstStoreFunctions nuget 包与 FunctionsConvention 一起使用。

【讨论】:

【参考方案2】:

代替 SqlQuery 试试这个 CreateQuery 类似的东西

    Field3 =  Db.Database.CreateQuery<string>("SELECT Db.Database.f_MyFunction(@someParameter1) FROM 1", new ObjectParameter("someParameter", someParameter)).FirstOrDefault();

【讨论】:

Db.Database 属性中没有 CreateQuery 方法。 msdn.microsoft.com/ru-ru/library/… 查看msdn.microsoft.com/en-us/library/bb339670(v=vs.110).aspx 这对我没有帮助。同样的错误,但错误的方法是 CreateQuery

以上是关于Select语句中的Entity Framework 6存储函数的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework——执行sql语句

mybatis <foreach>标签问题

JPQL 和元组列表作为 SELECT IN 语句的参数

在linq中怎样进行排序操作

处理来自 JPA/DAO 实体的结果中的非 DB 映射字段

Entity Framework 中的in操作实例