首页 > 解决方案 > EF:选择所有不在另一个表中的

问题描述

我是实体框架的新手。就我而言,我有两个表:Device其中存储所有设备,AssignedDevice以及存储在某个时间分配的所有设备。

我写了一个选择,选择所有Devices目前没有分配的。

您可以在下面找到表格、选择和我的问题:

表的模型类Device

public class Device 
{
        [Key]
        public string SerialNumber { get; set; }

        [Required]
        public string Type { get; set; }

        public virtual Brand Brand { get; set; }

        [ForeignKey("Brand")]
        [Required]
        public int BrandId { get; set; }

        [Required]
        public string Model { get; set; }

        public Device()
        {
        }
}

表的模型类AssignedDevice

public class AssignedDevice
{
        [Key]
        public int Id { get; set; }
        
        [Required]
        public Device Device { get; set; }

        [ForeignKey("Device")]
        public string DeviceId { get; set; }

        [Required]
        public int StudentId { get; set; }

        [Required]
        public DateTime AssignedFrom { get; set; }

        [Required]
        public DateTime AssignedUntil { get; set; }

        public IdentityUser Assignee { get; set; }
        
        [ForeignKey("Assignee")]
        [Required]
        public string AssigneeId { get; set; }

        public AssignedDevice()
        {
        }
}

这是我的“选择”:

var query = _dbContext.Devices.Join(
                _dbContext.AssignedDevices,
                device => device.SerialNumber,
                assignedDevice => assignedDevice.Device.SerialNumber,
                (device, assignedDevice) => new 
                {
                    serialNumber = device.SerialNumber,
                    type = device.Type,
                    brand = device.Brand.BrandName, 
                    model = device.Model,
                    assignedFrom = assignedDevice.AssignedFrom,
                    assignedUntil = assignedDevice.AssignedUntil
                })
                .Where(assignedDevice => assignedDevice.assignedFrom > System.DateTime.Now || assignedDevice.assignedUntil < System.DateTime.Now)
                .ToList();

我的问题是:

如何选择所有在Device但不在的项目AssignedDevice

数据必须在我已经写过的同一个选择中选择。

感谢您的回答。

标签: c#asp.net-mvcentity-framework-core

解决方案


要解决您的问题,您需要进行左连接而不是内连接。这是在 LINQ 查询中模拟左连接的简单方法,使用.DefaultIfEmpty()

var query = 
    from d in _dbContext.Devices
    from ad in _dbContext.AssignedDevices.Where(ad => ad.DeviceId == d.Id).DefaultIfEmpty()
    where ...
    select ...

如果您想要查询结果中的“正确”表中的字段,则必须处理空引用:

select new 
{
    AssignedFrom = ad != null ? ad.AssignedFrom : (DateTime?)null,
    ...
}

基本上就是 Ivan Stoev 在他的评论中所说的。


推荐阅读