2016-08-11 10 views
0

を作成します。この機能で機能を考えてみましょう空のラムダ式

public async Task<IEnumerable<Purchases>> GetPurchases(User user, Expression<Func<Purchases, bool>> whereClause) 
    {   
      using (var context = new UserDbContext()) 
      { 
       context.Users.Attach(user); 
       context.Entry(user).Collection(p => p.Purchases) 
       .Query() 
       .Where(whereClause) 
       .Load(); 

       if (Equals(user.Purchases, null)) 
        return new List<Purchases>(); 
      } 

     return user.Purchases; 
} 

回でnullすることができwhereClauseパラメータを、私はそうならば、そのヌルとは、空の式を割り当てるかどうかを確認したいんです。これは、私が来ている限り近い:

if (Equals(whereClause, null)) 
     whereClause =() => { }; 

これは質問hereに基づいていたが、空、私はエラーを取得していますwhereClause を作るラインのため。

エラー7は、すべてのコードパスが

誰もがこれを修正することができる方法を知っている「>購入、ブール」タイプ 「System.Func」<のラムダ式に値を返しませんか?

答えて

4

"すべてのコードパスが値を返すわけではありません"とは、ラムダが何も返さないことを意味します。つまり、コードパスは1つだけです。長いコードではありません。

Where requires a lambda which takes one parameter, and returns boolWhereに空のラムダ式を指定します。

アイテムをフィルタリングするために使用できるものを与える必要があります。簡単実際だ

if (Equals(whereClause, null)) 
    whereClause = o => true; 

かかわらず、常にあなたがそれを与えるものの、trueを返しwhere句です。それはおそらくあなたが望むものです:フィルターがない場合は、すべてを含めます。列挙の各項目に対して、一度に1つずつ、Whereは、項目にoというラムダを与えます。ラムダがtrueを返した場合、その値にはoの値が含まれます。

あなたは何の項目を返さないために、ヌルフィルタを使用する場合は、だけではなく、falseを返す:

if (Equals(whereClause, null)) 
    // Whatever it is, I'm against it. 
    whereClause = o => false; 
+0

イエス!完璧。 –

1

whereClauseはLinQs Where方法でそれを使用するブール値を返す必要があります。

あなたがリストをフィルタリングしたくないと仮定すると、あなたはそうfalsetrueを返す必要があります(すべての項目を含む):

if (Equals(whereClause, null)) 
    whereClause =() => true; 

注意:だけで値を返す場合{}は必要ありません単一の声明

しかし、ほとんどのフレームワークメソッドはこのようには機能しません。彼らは値を設定する代わりにArgumentNullExceptionを投げるでしょう。

1

whereClauseがnullの場合、フィルタを適用しないと仮定します。

 using (var context = new UserDbContext()) 
     { 
      context.Users.Attach(user); 
      context.Entry(user).Collection(p => p.Purchases) 
      .Query() 
      .Where(whereClause ?? p => true) 
      .Load(); 

      if (Equals(user.Purchases, null)) 
       return new List<Purchases>(); 
     } 
関連する問題