2016-08-11 91 views
0

考慮函數:創建空的lambda表達式

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; 
} 

在這個函數的參數whereClause可有時null,我想檢查其空,然後如果是這樣分配一個空的表達。因爲我來這是接近:

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

這是基於對這個問題here,但使whereClause空,我發現了錯誤的行。

錯誤7並非所有的代碼路徑在類型 「System.Func」 <的lambda表達式返回一個值「採購,布爾>」

任何人都知道這是如何被校正?

回答

4

「不是所有的代碼路徑都返回一個值」意味着你的lambda沒有返回任何東西。我的意思是,它只有一條代碼路徑,並且不是很長。

Where requires a lambda which takes one parameter, and returns boolWhere不會您給它一個空的lambda表達式。

你需要給它一些東西,它可以用來過濾項目。

這實際上很簡單:

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

這是一個WHERE子句總是返回true,不管你給它。這可能是你想要的:如果沒有過濾器,包括一切。對於枚舉中的每個項目,一次一個,Where將lambda表示爲o。如果lambda返回true,則在結果中包含該值o

如果你想有一個空篩選器不返回任何項目,只需返回false代替:

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

Yessir! PERFECTO。 –

1

whereClause必須返回一個布爾值,使用它在LinQs Where方法。

假設你不想過濾列表(包括所有項目),你必須返回true,否則false

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

通知:{}是沒有必要的,如果你只返回一個值一個單一的陳述。

但是你應該知道大多數框架方法不能以這種方式工作。他們會拋出一個ArgumentNullException而不是設置一個值。

1

假設當whereClause爲空時,您不想應用任何過濾器。

 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>(); 
     }