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

3

我有以下的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'

and following data

Position:

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个回答

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”表来改变处理多对多关系的方式。


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”子句将会给出错误的结果。在使用逗号分隔列表的许多对多关系中,存在更好的方法,例如使用中间表。

谢谢您的帮助,但是P.ID类型是Long而L.PositionID类型是字符串,我们不能使用L.PositionID.Contains(P.ID.ToString()) :( - ByulTaeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接