3
public IEnumerable<UserReadNews> GetLatestUserReadNews(IEnumerable<string> userIds)
{

    IQuery query = Session.CreateQuery("from UserReadNews as j where j.FacebookUser_id in (:userIds)");
    query.SetParameterList("userIds", userIds );
    return query.List();
}

表示するデータを決定してから停止するため、このデータをできるだけ遅延して返したいというこのメソッドがあります。テーブル全体に対してクエリ全体を実行したくありません。

私の懸念はList()メソッドです。これは怠惰ですか、それとも熱心ですか?

このメソッドを別のメソッドから呼び出すことはできますyield breakか?必要なものが完了したら?

4

2 に答える 2

1

IQuery.Listは常に結果セット全体を返すため、yieldブレークを使用して消費ループを早期に終了しても、遅延が増えることはありません。

最良の方法は(この場合に可能であれば)、クエリにすでに含まれている結果セットから本当に必要なアイテムを決定して、不要なデータをフェッチする手間をかけないようにすることです。

于 2012-05-01T18:24:49.113 に答える
1

絶対に必要なものだけをクエリすることについて、@CSharperに同意します。

その最適化の後でこれを可能な限り怠惰にする必要がある場合は、ICriteria.Future<T>()代わりにを使用してICriteria.List<T>()ください:

public IEnumerable<UserReadNews> GetLatestUserReadNews(IEnumerable<string> userIds)
{
    IQuery query = Session.CreateQuery("from UserReadNews as j where j.FacebookUser_id in (:userIds)");
    query.SetParameterList("userIds", userIds );
    return query.Future<UserReadNews>();
}

Futureすぐにリスト全体ではなく、遅延クエリを使用した実際のIEnumerableが提供されます。機会があれば、クエリも最適化することがあります。

于 2012-05-01T18:35:56.037 に答える