В проекте .NET Core 2.1 я использую EF Core с шаблоном Command (используя библиотеку MediatR ) в базе данных SQL Server.
Iнастроить проект, чтобы избежать оценки запросов клиента, используя следующие параметры:
var phaseOptions = new DbContextOptionsBuilder<PhaseDbContext>().UseSqlServer(configuration.GetConnectionString("PhaseDbContext"),
sqlServerOptions => sqlServerOptions
.EnableRetryOnFailure(
maxRetryCount: 5,
maxRetryDelay: TimeSpan.FromSeconds(30),
errorNumbersToAdd: null))
.ConfigureWarnings(warnings => warnings
.Throw(RelationalEventId.QueryClientEvaluationWarning)) // Disable Client query evaluation
.Options;
Теперь я получаю QueryClientEvaluationException
с этим запросом:
var articleCodes = await PhaseContext.PhaseArticles
.Where(a => !request.ArticleFamily.HasValue || a.GetArticleFamily() == request.ArticleFamily.Value)
.ToListAsync(cancellationToken);
Проблема в a.GetArticleFamily()
вызов метода, потому что этот метод теперь определяется следующим образом внутри класса сущности PhaseArticle
:
public class PhaseArticle
{
public int Id { get; set; }
public string Code { get; set; }
public string Description { get; set; }
public string UnitOfMeasure { get; set; }
public string Category { get; set; }
public string Group { get; set; }
public string Family { get; set; }
public double UnitCost { get; set; }
public string AdditionalDescription { get; set; }
public string ExternalCode { get; set;}
public string ColorCode { get; set;}
public string Note { get; set; }
public ArticleFamily GetArticleFamily()
{
switch (Family)
{
case "CEL":
return ArticleFamily.Cell;
case "STR":
return ArticleFamily.String;
case "RAW":
return ArticleFamily.OtherRawMaterial;
case "SFP":
return ArticleFamily.SemiFinishedPanel;
case "FP":
return ArticleFamily.FinishedPanel;
default:
return ArticleFamily.Other;
}
}
}
Теперь я хочу узнать, возможно ли сохранить параметр QueryClientEvaluationWarning
путем рефакторинга(и, вероятно, удаляясь от класса сущности) метод GetArticleFamily ().
Обновление 2019/02/26
@ StriplingWarrior Я снова обновил код с вашим предложением о ValueConverter()
, но теперь выдает эту ошибку:
Невозможно преобразовать лямбда-выражение в дерево выражений.
Обновление 2019/02/25
ПодписанПредложение @StriplingWarrior, я пытаюсь написать собственный конвертер, но не могучтобы компилировать мой код.
Ошибка с кодом ниже составляет примерно возвращаемое значение первого switch
блока (это string
, но ожидается, что оно будет enum
) и об ожидаемом входном значении второго блока переключателей (это string
, но ожидается, что оно будет enum
).
Это код:
public static void ApplyPhaseConversions<T>(this ModelBuilder modelBuilder)
{
modelBuilder
.Entity<PhaseArticle>()
.Property(e => e.Family)
.HasConversion(new ValueConverter<ArticleFamily, string> {
v =>
{
switch (v)
{
case ArticleFamily.Cell:
return "CEL";
case ArticleFamily.String:
return "STR";
case ArticleFamily.OtherRawMaterial:
return "RAW";
case ArticleFamily.SemiFinishedPanel:
return "SFP";
case ArticleFamily.FinishedPanel:
return "FP";
default:
return "";
}
},
v =>
{
switch (v)
{
case "CEL":
return ArticleFamily.Cell;
case "STR":
return ArticleFamily.String;
case "RAW":
return ArticleFamily.OtherRawMaterial;
case "SFP":
return ArticleFamily.SemiFinishedPanel;
case "FP":
return ArticleFamily.FinishedPanel;
default:
return ArticleFamily.Other;
}
}});
}