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またはEntityFrameworkで同等のものを探していると思います。(これまでのところ)2つの答えは、_session.Query<Person>()に置き換えられた場合、そのような同等のものになりますcontext.Persons。(ただし、Dariusの回答では、エンティティクエリでエンティティインスタンスを作成できないという例外がスローされます)。

ただし、Selectアドホックプロジェクションの作成に使用できることは別として、 AutoMapperの新しい機能の1つにより、さらに簡単になります。Automapperは、タイプのリストを別のタイプのリストにマップする(たとえば、プロジェクトする)ための非常に人気のあるツールです。しかし最近まで、その欠点は、メモリ内のリストでのみ機能することでした。つまり、プロジェクションがSQLクエリに伝播されませんでした。したがって、クエリされるフィールドの数を減らすために使用することはできませんでした(NHibernateの予測のように)。

この問題は、データアクセスコードでのAutoMapperの使用の停止で説明されています(タイトルにすべてが記載されています)。しかし、それはまた、予備的であるが優れた修正を提供し、それは後にAutomapper自体によって採用されました。

この機能により、次のような非常に簡潔なコードを記述できます。

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

(PersonとPersonDto間のマッピングがAutomapperに登録された後)。

現在、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 に答える