我是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>
答案 0 :(得分:0)
使用以下代码查看Entity Framework创建的SQL,然后尝试直接在数据库上运行它。
@PostConstruct
或在EF6中:
IQueryable query = from x in appEntities
where x.id = 32
select x;
var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();
(从How do I view the SQL generated by the Entity Framework?被盗)
很可能EF不会生成您认为的查询。您可以考虑在StringBuilder中构建查询并通过EF执行它,如下所示:
var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query)
.ToTraceString();