2010-10-04 163 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

相关问题