繁体   English   中英

Linq到SQL和Linq到实体的投影

[英]Projection in Linq to SQL and Linq to Entities

我正在尝试动态获取列。 在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投影所做的那样)。

数据访问代码中的“ 停止使用AutoMapper”中描述了此问题(标题说明了一切)。 但是它也提供了一个初步但出色的修复程序,后来被Automapper自己采用。

此功能可以编写非常简洁的代码,例如:

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

(在Personm和PersonDto之间的映射在Automapper中注册之后)。

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

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
           };

那不是可行的:

 _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
                 }
          );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM