2009-06-26 57 views
0

生成的SQL會進行交叉連接,但是當ID匹配時,它會像內部連接一樣工作,但是通過在C#中實際使用連接關鍵字,可以更好地執行此操作嗎?有沒有一種方法,你不必指定屬性如何加入,因爲他們都heirarchicly相關反正我的IQueryable語法是否正確?

項目是Page類

PageRoles是Page類

aspnet_Roles一個IQueryable屬性處於PageRole類一個IQueryable屬性

var item = _repository.GetByKey(999); 

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     && k.RoleId == fd.RoleId 
     select k.RoleName) 
     .Count(); 

編輯:

這裏是我的類中的IQueryable屬性的示例。下面的例子來自PageRole類

public IQueryable<aspnet_Role> aspnet_Roles 
{ 
    get 
    { 

      var repo=NorthCadburyWebsite.Models.aspnet_Role.GetRepo(); 
      return from items in repo.GetAll() 
       where items.RoleId == _RoleId 
       select items; 
    } 
} 

回答

0

我沒有我和我的智能感知,但我認爲你可以:

var f = (from fd in item.PageRoles 
     join k in fd.aspnet_Roles on k.RoleId equals fd.RoleId 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 
+0

將==更改爲等於,您必須交換所以fd.RoleId在左邊,k.RoleId在右邊,但是我相信這是正確的。我仍然試圖讓我的腦袋圍繞加入和層次結構的目的... – 2009-06-26 16:18:01

+0

你不能在fd.aspnet_Roles中加入k,因爲某些原因它不能識別fd ...? – Jon 2009-06-26 16:21:45

+0

我認爲我第一次是對的...... K.RoleID先於平等先走。 – 2009-06-26 16:53:20

0

這是否編譯或你得到一個錯誤?

在這種情況下,如您所述,您不需要連接。 我沒有使用過這種語法,但它看起來像你使用K作爲refererence(如SQL語法中的一個別名)

這應該產生相同的結果(甚至不需要使用K):

var f = (from fd in item.PageRoles 
     where Roles.GetRolesForUser().Contains(fd.aspnet_Roles.RoleName) 
     && fd.aspnet_Roles.RoleId == fd.RoleId 
     select fd.aspnet_Roles.RoleName) 
     .Count(); 

注意:未經測試,只是一個猜測。

-1

我覺得我很困惑,因爲我看到在您的查詢未作出任何意義以下層次:

 
[PageRoles] 
|--RoleId <~~~~~~~~~. 
|--[aspnet_Roles] | 
    |--RoleId ~~~~~~~* 
    |--RoleName 

RoleId,你只確定層次結構意思是PageRoles.RoleId參考aspnet_Roles.RoleId?所以,你可能有類似:

 
[PageRoles] [aspnet_Roles] 
|--RoleId |--RoleId 
      |--RoleName

而你試圖使它成以下:

 
[PageRoles] 
|--RoleId 
|--[aspnet_Roles] (where RoleId == PageRoles.RoleId) 
    |--RoleName 

...?


在這種情況下,如果你不能做到以下幾點,那麼事情是不對您的IQueryable屬性定義,而不是您已發佈查詢。即得到PageRolesaspnet_Roles子行的方法設置不正確。

var f = (from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     where Roles.GetRolesForUser().Contains(k.RoleName) 
     select k.RoleName) 
     .Count(); 

fd.aspnet_Roles應該已經由RoleId被約束,併產生一個內加入)。

您可以看到的SQL是從生成檢查您的層次結構:

var f = from fd in item.PageRoles 
     from k in fd.aspnet_Roles 
     select k; 

應該依稀相似(與具有扔在項目做某事):

SELECT k.RoleName, k.SomethingElse 
FROM PageRoles fd 
INNER JOIN aspnetRoles k ON fd.RoleId = k.RoleId; 

我敢肯定我錯過了一些東西,所以請幫我填寫空格...