31

LINQプロバイダーと新しいQueryOver構文を使用して、FluentNHibernateとNH3.0で遊んでいます。

ここで、QueryOverを使用して、タイムスタンプ値が指定された値にできるだけ近いが、それより大きくないアイテム(結果と呼ばれる)を取得したいと思います。

 Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.                
        FirstOrDefault(); //get the preceding or matching result, if there is any

さて、Intellisenseは、メソッドのようなものはないと言っていFirstOrDefault()ます。もちろん、注文したクエリを列挙してから、LINQを使用してアイテムを取得することもできます。ただし、これにより、最初にすべてのアイテムがメモリにロードされます。

に代わるものはありFirstOrDefault()ますか、または私は完全に間違っていることを理解しましたか?

4

5 に答える 5

39

IQueryOverインスタンスでTake()拡張メソッドを使用でき、次のようにリストに列挙するだけでよいことがわかりました。

Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.   
        Take(1).List(). //enumerate only on element of the sequence!
        FirstOrDefault(); //get the preceding or matching result, if there is any
于 2010-12-29T14:04:07.417 に答える
23
Result precedingOrMatchingResult = Session.QueryOver<Result>()
                                          .Where(r => r.TimeStamp < timeStamp)
                                          .OrderBy(r => r.TimeStamp).Desc
                                          .SingleOrDefault();
于 2011-08-25T02:03:40.430 に答える
12

NH 3には統合LINQプロバイダーがあります(クエリは内部でHQL / SQLに変換されます)。NHibernate.Linq名前空間を追加してから、次の操作を行う必要があります。

Result precedingOrMatchingResult = Session.Query<Result>().
    Where(r => r.TimeStamp < timeStamp).
    OrderByDescending(r => r.TimeStamp).
    FirstOrDefault();
于 2010-12-29T22:19:43.553 に答える
10

試す

Result precedingOrMatchingResult = Session.QueryOver<Result>().
        Where(r => r.TimeStamp < timeStamp).
        OrderBy(r => r.TimeStamp).Desc.
        SetFetchSize(1).
        UniqueResult();

UniqueResultは単一の値を返します。値が見つからない場合はnullを返します。これは、FirstまたはDefaultが行うことです。

フェッチサイズを1に設定する必要がある場合と不要な場合がありますが、プロファイラーを使用してテストします。

于 2010-12-29T13:44:09.573 に答える
0

SetFetchSize(1)必要とされている。LINQクエリが複数の結果を返す場合、クエリUniqueResult()から1つの結果のみが返されることを期待しているため、を使用してNHibernate例外をスローします。

于 2019-04-11T16:15:24.133 に答える