我对 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 端进行计算?
答案 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 本身就足够好。