实体框架核心翻译能力

时间:2021-07-31 17:41:54

标签: linq entity-framework-core

我对 SQLite 上的 Entity Framework Core 有一个相当理论化的问题。 我有一个实体 - Person { ID, FirstName, LastName, ... }, class PersonReference { ID, Representation : string }, 类型为 Person 的参数的扩展方法可以像这样从 Person 组合引用:

public static PersonReference ComposeReference(this Person from) => new PersonReference
            {
                ID = from.ID,
                Representation = from.FirstName + " " + from.LastName
            };

我需要在 sql 端编写引用。所以我做了以下事情:

var result = dbContext.People.Select(p => p.ComposeReference());

结果是可查询的,程序超越了这条线并成功地实现了集合。但是当我查看查询时,我看到它选择了 Person 的所有内容,然后查询文本结束。

如果我将 EF 表达式重写为直接

    var result = dbContext.People.Select(p => new PersonReference 
    {
                    ID = from.ID,
                    Representation = from.FirstName + " " + from.LastName
    });

它通过紧凑的选择和字符串连接为我提供了令人满意的表达式。

有没有办法在扩展方法中保持组合逻辑,但仍然在 SQL 端进行计算?

1 个答案:

答案 0 :(得分:0)

诀窍在于使用 System.Linq.Expressions.Expression。 我在工作中遇到了它,起初并没有得到它的用途,但它是为我需要的目的而设计的。 声明:

Expression<Func<Person, PersonReference>> ComposeReference => from => new 
             PersonReference
             {
                ID = from.ID,
                Representation = from.FirstName + " " + from.LastName
             };

用法:

var result = dbContext.People.Select(ComposeReference);

注意,表达式是可以编译的,但在这种情况下千万不要这样做,否则它会将您的 DbSet 视为 IEnumerable。

Svyatoslav 评论中的答案提到了一些库,但我认为 vanilla EF 本身就足够好。