2012-07-23 71 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的字段。