2012-02-23 12 views
0

Idプロパティが2番目のセットに含まれるセットからすべての要素を選択する必要があります。これを達成するために "SelectMany()"を使用できますか?このタイプのマッチング問題の最も効率的な最適解は何ですか?SelectMany()を使用するか、LINQ(ドット構文)で2つのシーケンスの要素を一致させる

: 結合エンティティセットを使用して、指定されたReportIdのすべてのDateRangeIdsを選択します。

セット

  • レポート {ReportId、REPORTNAME}
  • ReportDateRanges {DateRangeId、ReportId、ReportDateRangeId}
  • DateRanges {DateRangeId、DateRangeName}

私の解決策のコードはここにあります。これは適切なアプローチであれば、私はわからないですが、これは私が説明してきた問題解決を行います。

var report = Reports.Take(1).FirstOrDefault(); 
    int reportId = Convert.ToInt32(report.Id); 
    var dateRangeIds = ReportDateRanges.Where(rdr => rdr.ReportId == reportId).OrderBy(it => it.DateRangeId).Select(it => it.DateRangeId); 
    var dateRanges = DateRanges.Where(dateRange => dateRangeIds.Contains(dateRange.Id)); 

LINQの専門家を、このコードを批評し、任意の提案を提供すること自由に感じなさい。助けてくれてありがとう!

ここ

答えて

1

さて、あなたの例を使用するには、例えばEnumerable.Intersect(Of TSource) Method (IEnumerable(Of TSource), IEnumerable(Of TSource), IEqualityComparer(Of TSource))

を使用することができます。

var list1 = new List<int> {1,2,3,4,5,6,7,8}; 
var list2 = new List<int> {9,10,11,12,13,4,5}; 
list1.Intersect(list2); 

結果

4,5 

リンクで指定されたオーバーロードを使用して、両方の列挙の交差点を見つけるために、カスタムオブジェクトのEqualityComparerを指定することができます。

これが役に立ちます。

var report = Reports.Take(1).FirstOrDefault(); 

はあなたが書くことができます:

0

はそれを行うための一つの方法です:

IEnumerable<SomeTypeWithAnIDProperty> sourceSequence = //whatever 
IEnumerable<TypeOfTheIDProperty> ids = //whatever 

var selectedItems = 
    from sourceObject in sourceSequence 
    join id in ids 
     on sourceObject.ID equals id 
    select sourceObject; 

あるいは、

var dateRangeIds = ReportDateRanges 
    .Where(rdr => rdr.ReportId == reportId) 
    .OrderBy(it => it.DateRangeId) 
    .Select(it => it.DateRangeId); 

var dateRanges = DateRanges.Join(dateRangeIds, dateRange => dateRange.Id, id => id, (dateRange, id) => dateRange); 
1

私はあなたのコードがシンプルで読みやすいと思いますが、良いではない何かがある

var dateRangeIds = ReportDateRanges.Where(rdr => rdr.ReportId == reportId) 
            .OrderBy(it => it.DateRangeId) 
            .Select(it => it.DateRangeId); 
var report = Reports.FirstOrDefault(); 

そして、この行の

あなたはorderbyを使用しましたが、これは必要ありません。

1

コレクションに参加できます。 reportIdがあれば、このクエリを発行することができます。

Reports 
    .Where(report => report.ReportId == reportId) 
    .Join(ReportDateRanges, 
       report => report.ReportId, 
       rdr => rdr.ReportId, 
       (report, reportDateRange) => reportDateRange) 
    .Join(DateRanges, 
       rdr => rdr.DateRangeId, 
       dateRange => dateRange.DateRangeId, 
       (reportDateRange, dateRange) => dateRange); 
関連する問題