【发布时间】:2019-07-16 18:08:03
【问题描述】:
在 .NET Core 2.1 项目中,我在 SQL Server 数据库上使用带有命令模式的 EF Core(使用 MediatR 库)。
我通过使用这些设置来设置项目以避免客户端查询评估:
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;
}
}
}
现在,我想知道是否可以通过某种方式重构(并且可能远离实体类)GetArticleFamily() 方法来保留 QueryClientEvaluationWarning 选项。
2019 年 2 月 26 日更新
@StriplingWarrior 我再次根据您对ValueConverter() 的建议更新了代码,但现在出现此错误:
无法将 Lambda 表达式转换为表达式树。
2019 年 2 月 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;
}
}});
}
【问题讨论】:
标签: c# sql-server entity-framework entity-framework-core lazy-evaluation