EntityCommandCompilationException 指定的方法不受实体框架支持
Posted
技术标签:
【中文标题】EntityCommandCompilationException 指定的方法不受实体框架支持【英文标题】:EntityCommandCompilationException specified method not supported Entity Framework 【发布时间】:2016-08-24 13:29:57 【问题描述】:我是 Entity Framework 的新手,我一直在 Entity Framework 中获得 EntityCommandCompilationException
specified method not supported
。我不知道为什么会引发这个异常。
我使用here. 发布的指南为我安装 mysql 服务器 5.7 创建了一个自定义 UDF 聚合函数 my_Func()
它就像任何普通聚合函数一样工作,例如Sum() 会起作用。即我可以执行语句select my_Func(Column4) from db.table
并将所需结果作为double
返回。我已经对其进行了测试,它可以在 MySQL 服务器中运行。我希望能够在 linq to entity 查询中使用此方法,为了做到这一点,我做了以下事情。
using (var context = new dbEntities())
var results = from items in context.table
group items by new
items.Column1, items.Column2 into groupingItem
select new OutputType()
GroupedResult = groupingItem.OrderBy(x => x.Column3).Select(x => x.Column4).my_Func()
;
我创建了一个包含该方法的静态类。
public static class ModelDefinedFunctions
[DbFunction("dbModel.Store", "my_Func")]
public static double my_Func(this IEnumerable<double> items)
throw new NotSupportedException("Direct calls are not supported.");
在 .edmx 文件中我手动添加了以下标签
<Function Name="my_Func" ReturnType="double" Aggregate="true"
BuiltIn="false" NiladicFunction="false"
IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="db">
<Parameter Name="value" Type="Collection(double)" Mode="In" />
</Function>
【问题讨论】:
它解决了你的问题***.com/a/27029331/6733826 吗? 不,它没有。我没有命令文本,并且在我的代码中将 iscomposable 设置为 true。 也许我是个傻瓜,但是数据库方案真的是“db”,而不是“dbo”吗? 我愿意接受涉及实体框架的其他建议或解决方法; 我更喜欢 Code first 的方式,fluent api,... 好久没用 edmx 了,所以不能给你建议抱歉跨度> 【参考方案1】:使用以下代码查看 Entity Framework 创建的 SQL,然后尝试直接在您的数据库上运行它。
IQueryable query = from x in appEntities
where x.id = 32
select x;
var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();
或在 EF6 中:
var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query)
.ToTraceString();
(盗自How do I view the SQL generated by the Entity Framework?)
很可能 EF 没有生成您认为的查询。您可能会考虑在 StringBuilder 中构建查询并通过 EF 执行它,如下所示:
using (var db = new DbEntity())
var sqlStatement = new StringBuilder();
sqlStatement.AppendFormat("SELECT * FROM TABLENAME WHERE ID = '0' ", id);
var result = db.ExecuteStoreQuery<MyTableObject>(sqlStatement.ToString()).ToList();
【讨论】:
这种方法容易受到注入攻击。使用带参数的预处理语句而不是插值字符串。以上是关于EntityCommandCompilationException 指定的方法不受实体框架支持的主要内容,如果未能解决你的问题,请参考以下文章