2016-03-03 60 views
-1

基于下面的SQL,我正努力尝试在LINQ或方法语法中编写LINQ语句。将SQL转换为LINQ,带有多个连接和一个谓词

SELECT vr.* 
FROM VisualReport vr 
JOIN VisualReportRoleList vrl ON vr.VisualReportSK = vrl.VisualReportSK 
JOIN Role r ON vrl.RoleSK = r.RoleID 
JOIN UserRoleList url ON r.RoleID = url.RoleID 
JOIN Users u ON url.UserID = url.UserID 
WHERE u.ID = 1 

我试过很多东西,但没有运气。我打算在这里发布一些内容,但这只是让这篇文章看起来很杂乱。

任何人都可以帮助我吗?

+0

有一些相当不错的工具,可以帮助你做到这一点..做一个谷歌搜索'LinqPad'看看有没有免费的下载试用版 – MethodMan

回答

0

加入模式是这样的

帕拉姆1.要加入就行了,左边

参数2键(在呼吁加入什么),

帕拉姆3.关键在右边(你加入的是什么),

参数4.是结果选择器如何选择结果。

db.VisualReposts.Join(db.VisualRepostRoleLists, 
         vr => vr.VisualReportSK, 
         vrl => vrl.VisualReportSK 
         (vr, vrl) => new { vr, vrl}).Join(db.Roles, 
                 vrj => vrj.vrl.RoleSK, 
                 r => r.RoleID, 
                vrj, r => new {vr = vrj.vr, 
                   vrl = vrj.vrl, 
                   role = r}) 

    //follow the same patter for the rest of the joins. 
    // Also add your where clause, it might be a better idea to start 
    //from the users table so you can filter first 

但是,如果一切正确外键,您不需要进行连接,您可以访问ICollections。如果你可以或让他们外键,你可以像这样访问它们

var user = db.Users.Where(u => u.id == 1); 

//everything should have an icollection now so you can access via 
//user.UserRoleList.Roles ect or what ever you need 
0

简单的一对一转换。 LinqPad应该将其转换为与您的查询等效。

var result = (from vr in VisualReport 
    join vrl in VisualReportRoleList on vr.VisualReportSK equals vrl.VisualReportSK 
    join r in Role on vrl.RoleSK equals r.RoleID 
    join url in UserRoleList on vrl.RoleSK equals url.RoleID 
    join u in Users on url.UserID equals u.UserID 
    where u.ID == 1 
    select vr).ToList();