0

これをチェックしていただきありがとうございます。

私の状況は、ユーザーがカスタムのフィルター処理されたビューを作成できるシステムを持っていることです。これをリクエスト時に linq クエリに組み込みます。インターフェイスで、作成したすべてのビューの数を確認したいと考えています。かなり簡単です。複数のクエリを 1 つの呼び出しに結合することには慣れていますが、この場合、最初にいくつのクエリを持っているかわかりません。

このループがカウントクエリを単一のクエリに結合し、ToList() または FirstOrDefault() で実行できる手法を知っている人はいますか?

//TODO Performance this isn't good...
foreach (IMeetingViewDetail view in currentViews)
{
    view.RecordCount = GetViewSpecificQuery(view.CustomFilters).Count();
}

これは、私が参照している複数のクエリを組み合わせた例です。これは 2 つのクエリであり、匿名のプロジェクションに結合して、SQL サーバーへの単一のリクエストを生成します。

 IQueryable<EventType> eventTypes = _eventTypeService.GetRecords().AreActive<EventType>();
            IQueryable<EventPreferredSetup> preferredSetupTypes = _eventPreferredSetupService.GetRecords().AreActive<EventPreferredSetup>();

            var options = someBaseQuery.Select(x => new
                {
                    EventTypes = eventTypes.AsEnumerable(),
                    PreferredSetupTypes = preferredSetupTypes.AsEnumerable()
                }).FirstOrDefault();
4

1 に答える 1

0

パフォーマンスを考慮して、インターフェイスを からIEnumerable<T>Count プロパティを持つコレクションに変更します。と の両方IList<T>ICollection<T>count プロパティがあります。このように、コレクション オブジェクトはそのサイズを追跡しており、それを読み取るだけで済みます。

本当にループを回避したい場合は、RecordCount を再定義して、GetViewSpecificQuery を呼び出してカウントを 1 回取得する遅延読み込み整数にすることができます。

private int? _recordCount = null;
public int RecordCount 
{
    get 
    {
         if (_recordCount == null)
             _recordCount = GetViewSpecificQuery(view.CustomFilters).Count;
         return _recordCount.Value;
    }
 }
于 2013-08-05T16:12:33.540 に答える