2016-04-15 10 views
2

私のクラスのリストを選択するクエリがあります。 1つのLINQ文でこれを実行する方法はありLINQ異なる変数でdistinctを選択

SupplierModel.APLReason = agg.Select(r => r.APLReason).Distinct().ToList(); 
SupplierModel.AreaDesc = agg.Select(r => r.Area).Distinct().ToList(); 
SupplierModel.DeptName = agg.Select(r => r.DeptName).Distinct().ToList(); 
SupplierModel.StatCatDes = aggg.Select(r => r.StatusCategoryDesc).Distinct().ToList(); 

:私は、各変数を選択して、このような個別の値を取得するアプリケーションの後半で

IQueryable<ClaimsBySupplierAggregate> agg = 
    (from d in alliance.SupplierSearchByReviewPeriod 
    where d.ClientID == ClientID && ReviewPeriodIDs.Contains((int)d.ReviewPeriodID) 

    select new ClaimsBySupplierAggregate { 
     Amount = d.Amount, 
     StatusCategoryID = d.StatusCategoryID, 
     DeptName = d.DepartmentName, 
     APLReason = d.APLReason, 
     Area = d.AreaDesc, 
     StatusCategoryDesc = d.StatusCategoryDesc, 
     Agreed = d.Agreed 
    }); 

:それはそうのように見えますか?

+0

申し訳ありませんが、私は方法全体を貼り付けていません。私は喜んで –

+1

私はあなたがどこにでも別個の価値を得るのを見ていない。あなたのコードはすべての値を取得しています – Rob

+0

彼は彼が "異なった"、 "別々の"ではないと思う:-) – Jcl

答えて

2

Aggregateを使用することもできますが、シードには複雑なオブジェクトが必要になるため、同じ複雑さのコードになります。この特定のケースでは、LInQを使用してゴールデンハンマーの反パターンを入力すると思います。リストの代わりに旧式のループと4つのHashSetを使用すれば、コードは読みやすくなり、意図が明確になります。

0

私はこれを使用して、あなたの期待に沿ってコードをカスタマイズできると思います。 また、group byを使用することもできます。

public class LinqTest 
    { 
     public int id { get; set; } 
     public string value { get; set; } 

     public override bool Equals(object obj) 
     { 
      LinqTest obj2 = obj as LinqTest; 
      if (obj2 == null) return false; 
      return id == obj2.id; 
     } 

     public override int GetHashCode() 
     { 
      return id; 
     } 
    } 

    List<LinqTest> uniqueIDs = myList.Distinct().ToList(); 
0

これを行うには不自然な方法があります:

from d in alliance.SupplierSearchByReviewPeriod 
where d.ClientID == ClientID && ReviewPeriodIDs.Contains((int)d.ReviewPeriodID) 
group d by 0 into g 
select new 
{ 
    APLReasons = g.Select(d => d.APLReason).Distinct(), 
    AreaDescs = g.Select(d => d.Area).Distinct(), 
    DeptNames = g.Select(d => d.DeptName).Distinct(), 
    StatusCategoryDescs = g.Select(d => d.StatusCategoryDesc).Distinct(), 
} 

一部​​あなたは、その後、あなたが望む任意の集計を照会することができ、そこからすべての項目の一つのグループを作成します。

しかし...

...これはUNION Sと(もちろん)DISTINCT sの非常に非効率的なクエリを作成します。データベースからフラットなデータを単純に取得し、後続のコードで集計するのは、おそらくパフォーマンス上の方が良いでしょう。

関連する問題