如何将此SQL查询转换为LINQ或Lambda表达式?
我有以下SQL查询:如何将此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
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()):(