gpt4 book ai didi

c# - Linq to SQL 和 Linq to Entities 中的投影

转载 作者:行者123 更新时间:2023-12-02 05:36:27 24 4
gpt4 key购买 nike

我正在尝试动态获取列。在 NHibernate 中我可以这样做:

var list = _session.CreateCriteria(typeof(Person))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("FirstName"))
.Add(Projections.Property("LastName"))
.Add(Projections.Property("Jersey"))
.Add(Projections.Property("FortyYard"))
.Add(Projections.Property("BenchReps"))
.Add(Projections.Property("VertJump"))
.Add(Projections.Property("ProShuttle"))
.Add(Projections.Property("LongJump"))
.Add(Projections.Property("PersonSchoolCollection"))
)
.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)))
.List<Person>();

Linq 中的等价物是什么?

最佳答案

因为你也标记了我假设您正在寻找 Linq-to-Sql 或 Entity Framework 中的等效项。如果_session.Query<Person>(),这两个答案(到目前为止)将是等价的被 context.Persons 取代. (尽管 Darius 的回答会抛出一个异常,说明您不能在实体查询中创建实体实例)。

但除了可以使用 Select 之外创建一个临时投影,这是 AutoMapper 的新功能之一使它更容易。 Automapper 是一种非常流行的工具,用于将一个类型列表映射(例如:投影)到另一个类型列表。但直到最近它的缺点是它只适用于内存列表,即投影不会传播到 SQL 查询中。因此它不能用于减少查询字段的数量(如 NHibernate 投影所做的那样)。

Stop using AutoMapper in your Data Access Code 中描述了这个问题(标题说明了一切)。但它也提供了初步但出色的修复,后来被 Automapper 本身采用。

这个特性使得编写非常简洁的代码成为可能:

var dtoList = context.Persons.Project().To<PersonDto>();

(在Automapper中注册了Person和PersonDto的映射后)。

现在 SQL 查询只包含用于 PersonDto 的字段。

关于c# - Linq to SQL 和 Linq to Entities 中的投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621358/

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