2012-07-23 44 views
2

我想动态获取列。在NHibernate中,我可以这样做:在Linq中投影到SQL和Linq到实体

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中的等效项是什么?

回答

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

正如你也标记我假定你正在寻找在LINQ到SQL或实体框架等效。如果_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>(); 

(后人称和PersonDto之间的映射Automapper登记)。

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