2014-05-13 62 views
-1

我在努力轉換我寫入Linq的下列SQL查詢。我認爲我走在正確的軌道上,但我必須錯過一些東西。帶有雙重子查詢的Linq查詢

我得到現在的錯誤是:

System.Linq.IQueryable不包含定義。載

這是令人困惑的我,因爲它應該嗎?

SQL

select Users.* 
from Users 
where UserID in (select distinct(UserID) 
         from UserPermission 
         where SupplierID in (select SupplierID 
              from UserPermission 
              where UserID = 6)) 

LINQ

var Users = (from u in _db.Users 
      where (from up in _db.UserPermissions select up.UserID) 
       .Distinct() 
       .Contains((from up2 in _db.UserPermissions 
          where up2.UserID == 6 
          select up2.SupplierID)) 
      select u); 

編輯:我最終要回的SqlCommand對象,因爲這是我必須得到今天完成,不能浪費太多時間試圖找出如何以正確的方式與Linq和EF做到這一點。我討厭代碼的黑客:(

+0

我做的。此查詢只是一個大型存儲庫中的一個 – mituw16

+0

UserID和SupplierID是否屬於同一類型? –

+0

同意Nathan – qamar

回答

0

Contains()只要求單一元素,從而爲你寫它,它不會工作試試這個作爲備用。

var Users = _db.Users 
      .Where(u => _db.UserPermissions 
       .Select(x => UserID) 
       .Distinct() 
       .Where(x => _db.UserPermissions 
        .Where(y => y.UserID == 6) 
        .Select(y => y.SupplierID) 
        .Contains(x)) 
       ); 
+0

欣賞嘗試,但現在它錯誤''Where''不能隱含轉換System.Linq.IQueryable bool' – mituw16

+0

一旦它變得複雜,我傾向於停止使用簡單的LINQ語法,並去爲碼。我要寫這個,因爲我認爲問題是有一些缺失的括號。 –

+0

可能是,我可能只是將這個查詢切換回老派的SqlCommand對象查詢。 Linq很棒,但對於更復雜的查詢,我發現它有時候很缺乏。 – mituw16

0

我沒有在我身邊嘗試但你可以嘗試使用let關鍵字:

var Users = (from u in _db.Users 
      let distinctUsers = (from up in _db.UserPermissions select up).Distinct() 
      let subQuery = (from up2 in _db.UserPermissions 
          where up2.UserID == 6 
          select up2) 
      where 
      distinctUsers.SupplierID== subQuery.SupplierID && 
      u.UserID==distinctUsers.UserID 
      select u); 
1

我覺得沒有必要做一個distinct這裏(也許我是錯的),但這裏是一個簡單的版本(假設你把所有的導航性能的正確定義)

var lstUsers = DBContext.Users.Where(
        x => x.UserPermissions.Any(
            y => y.Suppliers.Any(z => z.UserID == 6) 
              ) 
            ).ToList(); 

上面,如果你有UserIDSupplier實體,如果不是,你可以再次使用導航財產,

var lstUsers = DBContext.Users.Where(
        x => x.UserPermissions.Any(
            y => y.Suppliers.Any(z => z.User.UserID == 6) 
              ) 
            ).ToList();