繁体   English   中英

如何在EF Core表达式中使用继承的属性?

[英]How to use inherited properties in EF Core expressions?

我们需要以动态方式构造EF的表达。 例如,创建测试模型:

public class TestBase
{
    public int Id { get; set; }
}

public class TestCard : TestBase
{
    public Guid Guid { get; set; }
}

创建一个linq查询:

var q = from card in Context.hlt_disp_Card
        select new TestCard
        {
            Id = card.disp_CardID,
            Guid = card.Guid
        };

正常使用表达式:

Expression<Func<TestCard, bool>> ex1 = card => card.Id == 1030;

q.Where(ex1).ToList();

我们需要使用任何类型的create表达式,并且始终具有属性的字符串名称,因此我们尝试以这种方式构造它:

var e = Expression.Parameter(typeof(TestCard), "card");
Expression bin = Expression.Property(e, "Id");
bin = Expression.Equal(bin, Expression.Constant(1030));
var ex2 = Expression.Lambda<Func<TestCard, bool>>(bin, e);

q.Where(ex2).ToList();

但是我们得到了警告:

Microsoft.EntityFrameworkCore.Query.Internal.SqlServerQueryCompilationContextFactory [8] LINQ表达式'(new TestCard(){Id = [card] .disp_CardID,Guid = [card] .Guid} .Id == 1030)'无法翻译并且将在本地进行评估。 要配置此警告,请使用DbContextOptionsBuilder.ConfigureWarnings API(事件ID为'RelationalEventId.QueryClientEvaluationWarning')。 重写DbContext.OnConfiguring方法或在应用程序服务提供程序上使用AddDbContext时,可以使用ConfigureWarnings。

我们在探查器中检查了生成的SQL并得到了以下结果:q.Where(ex1).ToList(); 建于

SELECT [card].[disp_CardID], [card].[Guid]
FROM [hlt_disp_Card] AS [card]
WHERE [card].[disp_CardID] = 1030

和q.Where(ex2).ToList(); 建于

SELECT [card].[disp_CardID], [card].[Guid]
FROM [hlt_disp_Card] AS [card]

如果我尝试为非继承属性(例如Guid)构造过滤器,我的方法会很好!

EF核心版本:1.0.1

如何解决这个问题呢?

哇,这听起来像是另一个EF Core错误(在v.1.1.0(发行版)中也会发生)。

两个表达式之间的唯一差别是ReflectedType属性访问表达的Member

您可以通过以下方式解决它:

// ...
var p = e.Type.GetProperty("Id");
if (p.ReflectedType != p.DeclaringType)
    p = p.DeclaringType.GetProperty(p.Name);
Expression bin = Expression.MakeMemberAccess(e, p);
// ...

但是有这样的要求很奇怪,我建议将问题报告给EF Core GitHub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM