2009-08-05 100 views
1

我遇到了一個問題,用LTS 我的代碼如下:比較運營商System.Linq.IQueryable`1 [System.Int32]「

return from p in _db.Companies 
where p.Deleted == false && 
(from q in _db.Contacts_Companies 
where q.ContactId == contactId && q.Deleted == false 
select q.CompanyId).Equals(p.Id) 
select p; 

我知道這個問題來自於CompanyId .Equals(Id) 他們都是Int32,但我有點困惑,Int32無法比較? 如果我使用包含,它不符合我的要求。

我該如何解決這個問題?

回答

1

與子查詢的問題來源:

from q in _db.Contacts_Companies 
where q.ContactId == contactId && q.Deleted == false 
select q.CompanyId 

這不返回int - 返回(如圖您的錯誤消息)IQueryable<int>

也許你陷入了linq的延遲執行語義?

無論如何,要解決此問題,您需要將IQueryable<int>轉換爲簡單的int。既然你總是期待一個結果,我建議加.First()

return from p in _db.Companies 
where p.Deleted == false && 
(from q in _db.Contacts_Companies 
where q.ContactId == contactId && q.Deleted == false 
select q.CompanyId).First().Equals(p.Id) 
select p; 
+0

是的,你說得對。 順便說一句,我可以用另一種方式寫,使查詢在這種情況下表現更好嗎? – ldsenow 2009-08-05 00:36:51

1

您的「內部」查詢正在選擇公司ID列表(即使該列表僅包含一個項目),因此將其與單個值進行比較是不正確的。

嘗試只選擇第一項:

return from p in _db.Companies 
     where !p.Deleted && (
      from q in _db.Contacts_Companies 
      where q.ContactId == contactId && !q.Deleted 
      select q.CompanyId).FirstOrDefault() == p.Id 
     select p;