2

我正在尝试动态获取列。在 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 中的等价物是什么?

4

3 回答 3

3

由于您还标记,我假设您正在寻找 Linq-to-Sql 或实体框架中的等价物。_session.Query<Person>()如果被替换,这两个答案(到目前为止)将是这样的等价物context.Persons。(尽管 Darius 的回答会抛出一个异常,说您不能在实体查询中创建实体实例)。

但是除了可以Select用来创建临时投影之外, AutoMapper的一项新功能使它变得更加容易。Automapper 是一种非常流行的工具,用于将类型列表映射(例如:项目)到另一个类型列表。但直到最近它的缺点是它只适用于内存列表,即投影不会传播到 SQL 查询中。所以它不能用来减少查询字段的数量(就像 NHibernate 预测一样)。

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

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

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

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

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

于 2012-07-26T22:47:23.790 回答
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
           };
于 2012-07-24T04:58:57.960 回答
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
                 }
          );
于 2012-07-24T05:00:01.710 回答