将 SQL 转换为 LINQ,具有多个联接和一个谓词

本文关键字:谓词 一个 转换 SQL LINQ | 更新日期: 2023-09-27 18:37:12

我正在努力尝试根据以下SQL用LINQ或方法语法编写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

我尝试了很多事情,但没有运气。我打算在这里发布其中的一些内容,但它只是使这篇文章阅读起来非常混乱。

这里有人可以帮助我吗?

将 SQL 转换为 LINQ,具有多个联接和一个谓词

连接模式的工作方式如下

参数 1. 是要加入的列表,

参数 2.key 在左边(您的呼叫加入),

参数 3.key 在右侧(您的加入是什么),

参数 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

一个简单的一对一转换。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();