如何将此SQL查询转换为LINQ或Lambda表达式?

时间:2010-10-04 09:57:50

标签: sql linq lambda sql-like linq-to-sql

我有以下SQL查询:

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或Lambda表达式?

感谢任何帮助!

2 个答案:

答案 0 :(得分: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'表来改变你处理多对多关系的方式。

答案 1 :(得分: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 };

请注意,当您拥有超过9个职位时,您的“包含/ LIKE”子句会给您带来不良结果。与使用逗号分隔列表相比,有更好的多对多关系方法。 (例如中间表。)