首页 > 解决方案 > 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();

但这对我的项目没有帮助,因为我需要为数据使用模型。

标签: c#entity-frameworklinq-to-sqlentity-framework-6

解决方案


如果以上所有表都通过 PK-FK 关系相关,则可以使用 linq lambda 函数 .Include() 包含相关表,然后使用导航属性访问数据。

如果表不相关,您可以使用 LINQ 左连接,如http://www.devcurry.com/2011/01/linq-left-join-example-in-c.html所示。

看起来您需要混合使用内连接和左连接。上面的例子只实现了内连接。


推荐阅读