Linq to SQL和Linq to Entities的预测

时间:2012-07-23 22:15:41

标签: c# nhibernate linq-to-sql 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中的等价物是什么?

3 个答案:

答案 0 :(得分:3)

由于您还标记了,我假设您正在寻找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
                 }
          );