2010-10-04 183 views
3

我有以下SQL查詢:如何將此SQL查詢轉換爲LINQ或Lambda表達式?

SELECT C.ID, C.Name FROM Category C JOIN Layout L ON C.ID = L.CategoryID 
JOIN Position P ON L.PositionID LIKE '%' + CAST(P.ID AS VARCHAR) + '%' 
WHERE P.Code = 'TopMenu' 

和下面的數據

位置:

ID  Code 

1  TopMenu 
2  BottomMenu 

類別

ID  Name 

1  Home 
2  Contact 
3  About 

佈局

ID  CategoryID  PositionID 
1  1    1 
2  2    1,2 
3  3    1,2 

隨着上述數據,是能夠將SQL查詢轉換爲LINQ或λ表達?

任何幫助表示讚賞!

回答

3

這可能會做你想要什麼:

Layout 
    .Where(x => Position 
     .Where(y => y.Code == "TopMenu") 
     .Select(y => SqlClient.SqlMethods.Like(x.PositionID, "%" + y.ID.ToString() + "%") 
     ).Count() > 0 
    ).Join(
     Category, 
     x => x.CategoryID, 
     x => x.ID, 
     (o,i) => new { ID = i.ID, Name = i.Name } 
    ) 

雖然你可能要兌現「位置」子查詢的時間節省,像這樣:

var innerSubQuery = Position.Where(y => y.Code == "TopMenu"); 

Layout 
    .Where(x => innerSubQuery 
     .Select(y => SqlClient.SqlMethods.Like(x.PositionID, "%" + y.ID.ToString() + "%") 
     ).Count() > 0 
    ).Join(
     Category, 
     x => x.CategoryID, 
     x => x.ID, 
     (o,i) => new { ID = i.ID, Name = i.Name } 
    ); 

不過,我同意Jon的觀點,要真正讓你的生活變得更簡單,你應該通過創建一個'Layout_Position'表來改變你處理多對多關係的方式。

+0

感謝您的評論 – ByulTaeng 2010-10-04 15:35:23

2

那麼,你將不能夠表達第二個連接作爲一個連接,因爲它不是一個等值連接,但是這應該這樣做:

from c in category 
join l in layout on c.Id equals l.CategoryId 
from p in position 
where p.Id.Contains(l.PositionId) 
select new { c.Id, c.Name }; 

請注意,您的「載/ LIKE」子句將如果您的職位超過9個,則會給您帶來不好的結果。與使用逗號分隔列表相比,有更好的多對多關係方法。 (如中間表)。

+0

感謝您的幫助,但P.ID類型是Long,L.PositionID類型是字符串,我們不能使用L.PositionID.Contains(P.ID.ToString()):( – ByulTaeng 2010-10-04 10:37:39

相關問題