gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:31:34 24 4
gpt4 key购买 nike

我们需要以动态方式为 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();

我们需要从任何类型创建表达式,并且我们总是有一个字符串名称的属性,因此我们尝试以这种方式构造它:

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] The LINQ expression '(new TestCard() {Id = [card].disp_CardID, Guid = [card].Guid}.Id == 1030)' could not be translated and will be evaluated locally. To configure this warning use the DbContextOptionsBuilder.ConfigureWarnings API (event id 'RelationalEventId.QueryClientEvaluationWarning'). ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.

我们在分析器中检查了生成的 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 .

关于c# - 如何在 EF Core 表达式中使用继承的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40805830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com