2009-08-06 12 views
1

リストを利用してリストメンバーシップをテストする方法があるかどうか知りませんか?たとえば、タイプがList<Enums.RebateType>のRebatesというプロパティを持つMembershipというクラスがあります。ラムダ式を使用してテストして、そのリストに特定のタイプのリベートが含まれているかどうかを確認する必要があります。次アップ嘲笑SQL構文に似た何かが1つのラムダ式を介して行うことができれば、私は思っていたリストのテスト<T>リストを使用する<T>

return Membership.Rebates.Exists(rebate => 
    (rebate.RebateType == Enums.RebateType.A && 
    rebate.RebateStatus == Enums.RebateStatus.Approved) || 
    (rebate.RebateType == Enums.RebateType.B && 
    rebate.RebateStatus == Enums.RebateStatus.Approved)); 

:代わりに次の操作を行うことの

return Membership.Rebates.Exists(rebate => 
    rebate.RebateType == Enums.RebateType.A && 
    rebate.RebateStatus == Enums.RebateStatus.Approved); 

を次のように私のorginalラムダ式です。

SELECT COUNT(*) 
FROM Membership.Rebates 
WHERE RebateType IN (ValidRebateTypes) AND Approved = true 

ValidRebateTypesまま現在I、すなわちValidRebateTypes =(Enums.RebateType.A、Enums.RebateType.B)をテストしていList<Enums.RebateType>あります。

次のように私は現在持っている回避策は次のとおりです。

bool exists = false; 
foreach (Enums.RebateType rebateType in ValidRebateTypes()) 
{ 
    exists = Membership.Rebates.Exists(
       rebate => 
       rebate.RebateType == rebateType && 
       rebate.RebateStatus == Enums.RebateStatus.Approved); 
    if (exists) { break; } 
} 
return exists; 

答えて

4

は、あなたが望むような音:


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType) 
           && r.RebateStatus == Enums.RebateStatus.Approved); 

その後、カウントに.Count()を使用することができます。


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType) 
           && r.RebateStatus == Enums.RebateStatus.Approved) 
        .Count(); 

または.Any()は、その条件を満たすものの存在を判断します。


Membership.Rebates.Any(r => ValidRebateTypes.Contains(r.RebateType) 
          && r.RebateStatus == Enums.RebateStatus.Approved); 
+2

彼が望むのは、(カウントではなく)存在しているかどうかを知ることだけで、 '.Count()'の代わりに '.Any()'を使うので、シバン全体を通過するのではなく最初のマッチで終了することができます。 –

+0

良いキャッチは、私は単に彼のSQLを複製していた。 – Marc

+2

また、Where with Anyを置き換え、Countをすべて失うだけです。 –

1

マークの提案に加えて、私はValidRebateTypesHashSet<Enums.RebateType>としています。これはより効率的であるだけでなく(小さなセットではないかもしれないが)、それはあなたの意図を明らかにする(すなわち、それぞれの値がRebateTypeであるということを明らかにする)。

関連する問題