2013-02-25 58 views
0

我試圖讓只有在使用本LAMBDA聲明LINQ查詢只有那些細節

list = list.Where(c=> c.CustomerSalesPeople.Count>0); 

一個細節的信息,但是我得到空例外,當我嘗試返回結果頭

return list.OrderBy(c => c.CustomerName).ToList(); 

我已經遍歷代碼,看到在我執行第一條語句後立即生成了空異常。有沒有更好的方法來實現這一點。

編輯

我試過的建議,我仍然得到一個空值。我想我會盡力解釋更好。我需要匹配該查詢

SELECT * 
    FROM [customer] 
    where customer_record_id in (select distinct(customer_id)from customer_sales_person) 
+0

是它的LINQ to對象/ SQL /實體空? – MarcinJuraszek 2013-02-25 07:34:57

+0

其linq對象。他們是llblgen實體。 LLBLGen是ORM – ChampChris 2013-02-25 07:36:52

+0

現在檢查我的答案 – 2013-02-25 07:55:26

回答

1
list = list.Where(c=>c.CustomerSalesPeople.Count>0).SingleOrDefault(); 

if(list!=null) 
    return list.OrderBy(c=>c.CustomerName).ToList(); 

return list; 

lambda表達式或者,如果你認爲,CustomerSalesPeople可以爲空,那麼你可以這樣做:

list = list.Where(c=>(c.CustomerSalesPeople==null) ||(c.CustomerSalesPeople.Count>0)); 

if(list!=null) 
    return list.OrderBy(c=>c.CustomerName).ToList(); 

return list; 

也可以看看.DefaultIfEmpty()擴展。

當找到空結果集時,Linq提供了優秀的擴展方法來計數。 這裏,他們是:

  1. .FirstOrDefault()
  2. .DefaultIfEmpty()
  3. .SingleOrDefault()

UPDATE:

做到這一點:

List<int> uniqueIds= listOfCustomerSalesPerson.Select(s=>s.Id).ToList().Distinct(); 
    var requireListOfCustomers = GetAllCustomers().Where(s=>uniqueIds.Contains(s.id); 

,你也可以在一個嵌入這兩個單獨的調用。但取決於您使用的數據提供程序的類型,它可能會給您一個錯誤,如「use only primitive types」.hence單獨的id列表。

例如,如果您使用EntityFramework 5.0和SQL Server,則可以執行此操作。

myDbContext db= new myDbContext(); 
var requiredList = db.Customers.Where(s=> 
           (s.CustomerSalesPeople ==null) 
           || 
           (s.CustomerSalesPeople.Select(o=>o.Id).Contains(s.Id)) 
           ).ToList(); 

我認爲,客戶包含List<CustomerSalesPeople>,它可以db.CustomerSalesPeople否則

+0

我將選擇更改爲任何,它的工作完美。不要以爲我知道將父變量作爲參數傳遞給子查詢。謝謝 – ChampChris 2013-02-25 08:39:26

0

你可以有你的收藏null元素。嘗試檢查在聲明中

return list != null ? 
    list.Where(c=> c!=null && c.CustomerSalesPeople.Count>0). 
    OrderBy(c => c.CustomerName).ToList() 
    :null;