3

Я новичок в Entity Framework и продолжаю получать EntityCommandCompilationExceptionspecified method not supported в Entity Framework. Я не могу понять, почему это исключение возникает.EntityCommandCompilationException указанный метод не поддерживается Entity Framework

Я создал пользовательскую функцию агрегации UDF my_Func() для моей установки сервера MySQL 5.7 с использованием опубликованных рекомендаций here. Он работает так же, как и любая обычная агрегированная функция, например. Сумма() будет работать. то есть я могу выполнить оператор select my_Func(Column4) from db.table и он возвращает желаемый результат в виде double. Я протестировал его, и он работает на сервере MySQL. Я хочу иметь возможность использовать этот метод в запросе linq для сущностей, и для этого я сделал следующее.

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

ли это решить проблему http://stackoverflow.com/a/27029331/6733826? – Mathieu

+0

Нет, нет. У меня нет командного текста, а issoposable в моем коде установлено в true. –

+0

Может быть, я дурак, но действительно ли схема базы данных «db», а не «dbo»? – Mathieu

ответ

0

Используйте следующий код, чтобы увидеть SQL, который создает Entity Framework, а затем попытаться запустить его прямо на вашей базе данных.

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(); 
} 
+1

Этот подход уязвим для инъекционной атаки. Используйте подготовленные операторы с параметрами вместо интерполированных строк. –