c# - Linq to SQL - 获取相关数据
问题描述
我有一些数据需要返回一些相关数据并将其全部放入模型中。我在模型中设置了所有适当的字段,如下所示:
public class ComputerModel
{
public int MachineId { get; set; }
public int GroupId { get; set; }
public int SoftwareVersionId { get; set; }
public string GroupName { get; set; }
public string SoftwareVersion { get; set; }
public string IPAddress { get; set; }
public string HostName { get; set; }
public string MACAddress { get; set; }
public string Title { get; set; }
public bool IsIGMonitor { get; set; }
public string UpTime { get; set; }
public DateTime DateEntered { get; set; }
public string EnteredBy { get; set; }
public Nullable<DateTime> DateUpdated { get; set; }
public string UpdatedBy { get; set; }
public ICollection<MachineRole> MachineRoles { get; set; }
public ICollection<Role> Roles { get; set; }
}
这是我尝试使用的 linq 语句:
var query = (from m in unitOfWork.Context.Machines
join u in unitOfWork.Context.Users
on m.EnteredBy equals u.UserId into EntByUser
from EnteredByUser in EntByUser.DefaultIfEmpty()
join u2 in unitOfWork.Context.Users
on m.UpdatedBy equals u2.UserId into UpdByUser
from UpdatedByUser in UpdByUser.DefaultIfEmpty()
join g in unitOfWork.Context.Groups
on m.GroupId equals g.GroupId into Grp
from Groups in Grp.DefaultIfEmpty()
join s in unitOfWork.Context.SoftwareVersions
on m.SoftwareVersionId equals s.SoftwareVersionId into SW
from SoftwareVersions in SW.DefaultIfEmpty()
join mr in unitOfWork.Context.MachineRoles
on m.MachineId equals mr.MachineId into MachRoles
from MachineRoles in MachRoles.DefaultIfEmpty()
join r in unitOfWork.Context.Roles
on MachineRoles.RoleId equals r.RoleId into Rolz
from Rolz2 in Rolz.DefaultIfEmpty()
select new ComputerModel()
{
MachineId = m.MachineId,
GroupId = m.GroupId,
SoftwareVersionId = m.SoftwareVersionId,
GroupName = Groups.GroupName,
SoftwareVersion = SoftwareVersions.Version,
IPAddress = m.IPAddress,
HostName = m.HostName,
MACAddress = m.MACAddress,
Title = m.Title,
IsIGMonitor = m.IsIGMonitor,
UpTime = m.UpTime,
DateEntered = m.DateEntered,
DateUpdated = m.DateUpdated,
EnteredBy = EnteredByUser.FirstName + " " + EnteredByUser.LastName,
UpdatedBy = UpdatedByUser.FirstName + " " + UpdatedByUser.LastName,
MachineRoles = m.MachineRoles,
Roles = ?????
}).ToList();
我可以让 MachineRoles 填充,但我无法让 Roles 填充。我已经尝试过Roles = Rolz2
,但 Rolz 返回一个 Role 实例,而不是一个集合。
如何让这个查询返回 Machines 以及 MachineRoles 和 Roles 的相关数据?
我看过以下文章,但运气不佳:
这篇 SO 文章
加载相关数据 - MSDN
Using Include with Entity Framework
更新
我注意到如果我删除我的模型并使用匿名类型,那么我不会收到任何错误:
select new ()
{
GroupName = Groups.GroupName,
......
}).ToList();
但这对我的项目没有帮助,因为我需要为数据使用模型。
解决方案
如果以上所有表都通过 PK-FK 关系相关,则可以使用 linq lambda 函数 .Include() 包含相关表,然后使用导航属性访问数据。
如果表不相关,您可以使用 LINQ 左连接,如http://www.devcurry.com/2011/01/linq-left-join-example-in-c.html所示。
看起来您需要混合使用内连接和左连接。上面的例子只实现了内连接。
推荐阅读
- python - 加载 keras 模型,TypeError:“模块”对象不可调用
- angular - 为列表中的每个项目并行运行 observable,无需等待
- ios - 有没有办法为 IOS 的视频保存 AVDepthData?
- cmake - 如何在 CMake 项目(c++、Clion)中链接 Gurobi 求解器?
- python - 根据给定日期获取下个月最后一天的日期
- python - 在 Python 中用引号和逗号分割一列
- python - python中行首的冒号
- spring-boot - Kotlin Spring Boot CORS“选项/用户没有映射”
- node.js - 使用 @google-cloud 进行工作负载身份联合
- android - 如何复制 WebView 中的所有文本