2

奇妙な問題があります。以下に定義されているコードに気づきました。

var query= unitOfWork.Session.CreateCriteria(typeof (SomeEntity)).Future<SomeEntity>().AsQueryable();
var queryWithWhere= query.Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower()));
var result= queryWithWhere.ToList();

適切な結果が得られますが、NHibernateProfilerで監視したSQLクエリにwhere句が含まれていません。

SELECT ... 
FROM SomeEntity

そして、私のコードからのこれWHEREは、Linq-to-SQLの代わりにLinq-to-Objectsのように、SQLクエリの実行後に使用されるようです。

そしてもちろん、SQLクエリは3行目が進んだ後に開始されます。

4

4 に答える 4

2

Linq を使用し、NHibernate がそれを理解できるようにする場合は、CreateQuery<T>拡張機能 (名前空間内の NHibernate の一部) を使用して、- を使用するのではなく、NHibernate.Linqを直接作成します。 NHibernate が制限として処理するクエリ。IQueryable<T>CreateCriteria<T>

于 2013-03-01T13:56:36.777 に答える
1

最初のクエリ内にWHEREが必要な場合は、制限を追加する必要があると思います。

 unitOfWork.Session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.Eq("SomeProperty", "Some Value"))

乾杯

編集

またはあなたにより適しています

 unitOfWork.Session.CreateCriteria<SomeEntity>()
    .Add(Restrictions.InsensitiveLike("SomeProperty", "Some Value"))
于 2013-03-01T13:34:59.133 に答える
0

私はQueryOver<T>あなたの代わりに行き、あなたの用法を追加NHibernate.Criterionします。コードは次のようになります。

    using NHibernate.Criterion;
    //...
    var result = session.QueryOver<SomeEntity>()
        .Where(e => e.SomeProperty
            .IsLike("xyz", MatchMode.Anywhere)).List().ToList();

必要に応じてクエリを生成します。

于 2013-03-04T18:13:09.290 に答える
0

AsQueryable()コレクションがロードされ、IQueryable としてキャストされるため、NHibernate は結果セットをマテリアライズしています。Entity Framework での同様の動作については、この質問を参照してください。

NHibernate の LINQ プロバイダーを使用するようにクエリを書き直します。

var result = session.Query<SomeEntity>()
                    .Where(x => x.SomeProperty.ToLower().Contains("Xxx".ToLower)));
于 2013-03-01T16:08:23.947 に答える