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

如何将此SQL查询转换为LINQ或Lambda表达式?,sql,linq,lambda,sql-like,linq-to-sql,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

我有以下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表达式


感谢您的帮助

您将无法将第二个联接表示为联接,因为它不是equijoin,但这应该可以做到:

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个以上的职位时,你的“contains/LIKE”子句会给你带来糟糕的结果。有比使用逗号分隔列表更好的方法处理多对多关系。(例如中间表。)

这可能会满足您的要求:

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 }
    )
尽管您可能希望具体化“Position”子查询以节省时间,如下所示:

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的观点,为了让生活更简单,你应该通过创建一个“布局位置”表来改变处理多对多关系的方式。

谢谢你的帮助,但是p.ID类型很长,L.PositionID类型是字符串,我们不能使用L.PositionID.Contains(p.ID.ToString()):(