【问题标题】:How to convert this SQL query to LINQ or Lambda expression?如何将此 SQL 查询转换为 LINQ 或 Lambda 表达式?
【发布时间】:2010-10-04 09:57:50
【问题描述】:

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

感谢任何帮助!

【问题讨论】:

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


    【解决方案1】:

    这可能会做你想做的事:

    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()) :(跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2011-07-18
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多