SqlFunctions.StringConvert () не работает в ядре - PullRequest
2 голосов
/ 19 февраля 2020

Я перемещаю приложение в ядро. net. но SqlFunctions.StringConvert () не работает в .core. Я использую следующий код:

using (var entity = new AppEntity())
            {
            var    physianAggregationList = (from physianAggregaton in entity.tbl_Physician_Aggregation_Year

                                          where (
                                                 (physianAggregaton.CMS_Submission_Year == cmsyear)
                                                 && (physianAggregaton.Physician_NPI == npi || (string.IsNullOrEmpty(npi)))
                                                 && physianAggregaton.Is_90Days == is_90Days && physianAggregaton.Exam_TIN == Tin                                                  
                                                 )
                                          select new Tindata
                                          {


                                              Performance_Rate = entity.tbl_Lookup_Measure.Where(i => i.Measure_num.ToLower() == physianAggregaton.Measure_Num.ToLower()
                                                                                                  && i.CMSYear == physianAggregaton.CMS_Submission_Year)
                                                                                                  .Select(x => x.Perf_Rate_Per_1000).FirstOrDefault() == boolValue
                                                                                                  ? (physianAggregaton.Performance_rate == null ? "NULL" : SqlFunctions.StringConvert(physianAggregaton.Performance_rate, 100, 2))
                                                                                                  : (physianAggregaton.Performance_rate == null ? "NULL" : SqlFunctions.StringConvert(physianAggregaton.Performance_rate, 100, 2) + "%"),


                                              Reporting_Rate = physianAggregaton.Reporting_Rate == null ? "NULL" : SqlFunctions.StringConvert(

                                              //}).Distinct().OrderBy(x=>x.displayorder).ToList();
                                          }).Distinct().OrderBy(x => x.LastName).ToList();
                ///logger.LogInfo("PhysianAggregation Count in getPhysianAggregationData():[" + physianAggregationList.Count()+"]");
            } 

1 Ответ

3 голосов
/ 19 февраля 2020

SqlFunctions является классом EF6 c и не может использоваться в EF Core. Пользовательские функции EF Core доступны как методы расширения EF.Functions.

К сожалению, в настоящее время EF Core не обеспечивает эквивалент StringConvert. Но его можно относительно легко добавить, используя EF Core Отображение скалярной функции базы данных и метод сопоставления STR, аналогичный тому, что делал EF6.

Например, добавьте следующий класс ( с необходимыми using s):

public static class SqlFunctions
{
    public static string ToString(this decimal? value, int? length, int? decimalArg) => throw new NotSupportedException();
    public static string ToString(this double? value, int? length, int? decimalArg) => throw new NotSupportedException();
    public static ModelBuilder AddSqlFunctions(this ModelBuilder modelBuilder) => modelBuilder
        .MapToSTR(() => ToString(default(decimal?), null, null))
        .MapToSTR(() => ToString(default(double?), null, null));
    static ModelBuilder MapToSTR(this ModelBuilder modelBuilder, Expression<Func<string>> method)
    {
        modelBuilder.HasDbFunction(method).HasTranslation(args =>
            new SqlFunctionExpression(null, null, "STR", false, args, true, typeof(string), null));
        return modelBuilder;
    }
}

, затем внутри вашего OnModelCreating переопределения:

if (Database.IsSqlServer()) modelBuilder.AddSqlFunctions();

затем внутри запроса замените

SqlFunctions.StringConvert(physianAggregaton.Performance_rate, 100, 2)

с

physianAggregaton.Performance_rate.ToString(100, 2)
...