在 C# 中将 SQL 查询转换为 LINQ 方法语法

Posted

技术标签:

【中文标题】在 C# 中将 SQL 查询转换为 LINQ 方法语法【英文标题】:Convert SQL query to LINQ method syntax in C# 【发布时间】:2021-08-04 01:31:24 【问题描述】:

我想从 4 个相互关联的表中获取数据。

场景:一个人可以借出属于某个程序的设备

      Database Tables
person          -> Persons Database Table           
device loan     -> Loan Database Table  
device          -> Devices Database Table  
program         -> Programs Database Table

这些是图表中的数据库表:

这是所需的输出:

上面的输出是由以下 SQL 查询产生的:

SELECT A.*, 
COALESCE(ps.first_name,'') AS firstname,
COALESCE(ps.last_name,'') AS lastname,
COALESCE(p.program_name, '') AS program_Name 
FROM devices A 
LEFT JOIN device_loans l ON l.device_id = A.device_id
LEFT JOIN persons ps ON ps.person_id = l.person_id
LEFT JOIN programs p ON A.program_id = p.program_id
WHERE A.device_type ="Tablet" AND  p.program_id = 5;

我想将 SQL 查询转换为 LINQ 方法语法。我试过了 以下方法:

var devices = from ds in _context.Devices
        join p in _context.Programs on ds.ProgramID equals p.Id 
        join l in _context.DeviceLoan on ds.Id equals l.device_id 
        join ps in _context.Persons on l.device_id equals ps.Id 
        where ds.Type == typeName
        where ds.ProgramID == id
        select new Device
              
                  Id = ds.Id,
                  ProgramID = p.Id,
                  Type = ds.Type,
                  Serial_Number = ds.Serial_Number,
                  Label = ds.Label,
                  Price = ds.Price,
                  Purchase_Date = ds.Purchase_Date,
                  Device_Status = ds.Device_Status
                  
              ;

我想要的是创建一个 LINQ 方法语法,其中包括 Database Persons TableDatabase 中的 Firstname 和 Lastname Programs TableDatabase Devices Table 中的数据,就像上面的 SQL 查询一样。

Output: I want all devices of a certain program, loan or not loan with 
        first name & last name of a Person loan too. 

感谢您的帮助

【问题讨论】:

我认为你的问题是你没有做左连接,看看怎么做:***.com/questions/3404975/left-outer-join-in-linq 这能回答你的问题吗? LEFT OUTER JOIN in LINQ 使用 linqpad 将 sql 转换为 linq,反之亦然。这只是一个刚刚安装的应用程序,您可以编写查询。 linqpad.net @RahulShukla 我不认为 LINQPad 从 sql 到 Linq。它将执行 Linq to sql。 如果您发布课程,我会帮助您将其转换为 LINQ。 【参考方案1】:

感谢各位的帮助。我创建了以下查询,它给了我想要的。

var devices = _context.Devices.
                    Where(c => c.Type == typeName && c.ProgramID == id).
                    Include(c => c.Program).
                    Include(c => c.DeviceLoans)
                        .ThenInclude(x => x.Persons).
                    ToList();

在.cshtml

var loan_object = item.DeviceLoans.Where(d=>d.device_id==item.Id).FirstOrDefault()

要获取设备借给的人的姓名,我使用上面的代码行。

【讨论】:

以上是关于在 C# 中将 SQL 查询转换为 LINQ 方法语法的主要内容,如果未能解决你的问题,请参考以下文章

C# 将带有 Case 语句的 SQL 查询转换为 LINQ

C# LINQ 中的多短语搜索无法转换为 SQL

使用 Entity Framework Core 在 LINQ 查询中将字符串转换为 DateTime

在c#/LINQ中将数组转换为字符串的最短方法[重复]

如何将此 SQL 内部联接查询转换为 LINQ 语法?

将 sql 转换为 LINQ C#