我有以下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表达式?
感谢任何帮助!
答案 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”子句会给您带来不良结果。与使用逗号分隔列表相比,有更好的多对多关系方法。 (例如中间表。)