我正在尝试动态获取列。在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中的等价物是什么?
答案 0 :(得分:3)
由于您还标记了linq-to-sql和linq-to-entities,我假设您正在寻找Linq-to-Sql或Entity Framework中的等效项。如果_session.Query<Person>()
被context.Persons
取代,那么这两个答案(到目前为止)就是这样的答案。 (虽然Darius的回答会抛出异常,说你不能在实体查询中创建实体实例)。
但除了使用Select
创建临时投影的可能性之外,AutoMapper的一个较新功能使其变得更加容易。 Automapper是一种非常流行的工具,可以将类型列表映射(例如:project)到另一个类型列表。但直到最近它的缺点是它只能在内存列表中工作,即投影没有传播到SQL查询中。所以它不能用于减少查询字段的数量(如NHibernate预测那样)。
Stop using AutoMapper in your Data Access Code中描述了这个问题(标题说明了一切)。但它也提供了初步但非常好的修复,后来被Automapper本身采用。
此功能可以编写非常简洁的代码,如:
var dtoList = context.Persons.Project().To<PersonDto>();
(在Person和PersonDto之间的映射在Automapper中注册后)。
现在,SQL查询仅包含用于PersonDto的字段。
答案 1 :(得分:1)
var list = from person in context.Persons
select new Person()
{
FirstName = person.FirstName,
LastName = person.LastName,
Jersey = person.Jersey,
FortyYard = person.FortyYard,
BenchReps = person.BenchReps,
VertJump = person.VertJump,
ProShuttle = person.ProShuttle,
LongJump = person.LongJump,
PersonSchoolCollection = person.PersonSchoolCollection
};
答案 2 :(得分:1)
这不会起作用:
_session.Query<Person>()
.Select(new {FirstName, LastName, Jersey, FortyYard})
.ToList()
.Select(x => new Person() {
FirstName = x.FirstName,
LastName = x.LastName,
Jersey = x.Jersey,
FortyYard = x.FortyYard
}
);