Отобразить / использовать встроенную функцию MySQL в Entity Framework - PullRequest
0 голосов
/ 24 сентября 2018

Надеюсь, довольно простой вопрос: я хочу использовать встроенные функции MySQL точно так же, как YEARWEEK или INSERT в Entity Framework 6 (аналогично пространству имен System.Data.Entity.DbFunctions).Есть ли способ добавить сопоставление для этих функций?

Я уже пытался добавить их через файл edmx, но это не сработало.

<!-- edmx:ConceptualModels -->
<Function Name="YearWeek" ReturnType="String">
    <Parameter Name="date" Type="DateTime" />
    <DefiningExpression>
        YEARWEEK(date, 3)
    </DefiningExpression>
</Function>

<!-- edmx:StorageModels -->
<Function Name="YEARWEEK" IsComposable="true" ReturnType="varchar" BuiltIn="true" Aggregate="false" NiladicFunction="false" ParameterTypeSemantics="AllowImplicitConversion">
    <Parameter Name="date" Type="datetime" Mode="In" />
    <Parameter Name="mode" Type="int" Mode="In" />
</Function>

И в моемc # код:

[System.Data.Entity.DbFunction("otrsModel", "YearWeek")]
public static string YearWeek(DateTime date) {
    throw new NotSupportedException("Direct calls are not supported.");
}

Это, прямо сейчас, бросает мне System.Data.Entity.Core.EntityCommandCompilationException.Внутреннее исключение: "'YEARWEEK' не может быть преобразован в допустимый тип или функцию."

Однако вызов следующего кода в той же базе данных работает нормально:

var week = db.Database.SqlQuery<dynamic>("SELECT INSERT(YEARWEEK(create_time, 3), 5, 0, '/'), ticket.* AS a FROM ticket").ToList();

Есть идеи, что здесь не так?

1 Ответ

0 голосов
/ 24 сентября 2018

Я наконец решил проблему, и решение довольно простое: добавление определения к edmx:ConceptualModels не нужно.Вам просто нужно добавить определение edmx:StorageModels и вызвать его правильно.Вот мой модифицированный код с примерными реализациями встроенных функций MySQL INSERT и YEARWEEK :

<!-- edmx:StorageModels -->
<Function Name="YEARWEEK" IsComposable="true" ReturnType="varchar" BuiltIn="true" Aggregate="false" NiladicFunction="false" ParameterTypeSemantics="AllowImplicitConversion">
  <Parameter Name="date" Type="datetime" Mode="In" />
  <Parameter Name="mode" Type="int" Mode="In" />
</Function>
<Function Name="INSERT" IsComposable="true" ReturnType="varchar" BuiltIn="true" Aggregate="false" NiladicFunction="false" ParameterTypeSemantics="AllowImplicitConversion">
  <Parameter Name="str" Type="varchar" Mode="In" />
  <Parameter Name="position" Type="int" Mode="In" />
  <Parameter Name="number" Type="int" Mode="In" />
  <Parameter Name="substr" Type="varchar" Mode="In" />
</Function>

И соответствующий код c #:

namespace MySQL_3 {
    class Program {
        static void Main(string[] args) {
            var db = new myEntities();

            var test = db.ticket.Select(t => t.change_time.YearWeek(3).Insert(5, 0, "/"));

            var test2 = test.ToList();

            Console.Read();
        }
    }

    public static class BuiltInFunctions {

        [DbFunction("myModel.Store", "YEARWEEK")]
        public static string YearWeek(this DateTime date, Int32 mode) => throw new NotSupportedException("Direct calls are not supported.");

        [DbFunction("myModel.Store", "INSERT")]
        public static string Insert(this string str, int position, int number, string substr) => throw new NotSupportedException("Direct calls are not supported.");
    }
}
...