C# EF:选择所有不在另一个表中的

C# EF:选择所有不在另一个表中的,c#,asp.net-mvc,entity-framework-core,C#,Asp.net Mvc,Entity Framework Core,我不熟悉实体框架。在我的例子中,我得到了两个表:Device存储所有设备和AssignedDevice存储某个时间分配的所有设备 我写了一个select,它选择了目前没有分配的所有设备 您可以在下面找到表格、选择和我的问题: 表设备的模型类: public class Device { [Key] public string SerialNumber { get; set; } [Required] public string

我不熟悉实体框架。在我的例子中,我得到了两个表:
Device
存储所有设备和
AssignedDevice
存储某个时间分配的所有设备

我写了一个select,它选择了目前没有分配的所有
设备

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

设备的模型类

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()
        {
        }
}
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()
        {
        }
}
分配设备的模型类

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()
        {
        }
}
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=\u dbContext.Devices.Join(
_dbContext.AssignedDevices,
device=>device.SerialNumber,
assignedDevice=>assignedDevice.Device.SerialNumber,
(设备,分配的设备)=>新建
{
serialNumber=设备。serialNumber,
类型=设备。类型,
品牌=设备。品牌。品牌名称,
模型=设备。模型,
assignedFrom=assignedDevice.assignedFrom,
assignedUntil=assignedDevice.assignedUntil
})
.Where(assignedDevice=>assignedDevice.assignedFrom>System.DateTime.Now | | assignedDevice.assignedUntil
我的问题是:

如何选择
设备
中但不在
分配设备
中的所有项目

必须在我已经编写的同一选择中选择数据


谢谢你的回答。

要解决你的问题,你需要做左连接而不是内连接。下面是一种使用
.DefaultIfEmpty()
在LINQ查询中模拟左连接的简单方法:

如果希望查询结果中的“右”表中的字段,则必须注意空引用:

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

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

除了
方法之外,您可以使用
方法,类似这样的一般方法(来自SQL world)是使用
左外连接
(可以在LINQ中模拟)结合
右==null
条件。但是,您不能使用相同的选择,因为
assignedDevice
将为
null
,因此您需要进行一些修改,例如将结果
assignedFrom
assignedinitil
属性设置为空。不过,EF(核心)方法是定义集合导航属性并使用它而不是联接。e、 g.如果没有投影,您所询问的条件将类似于
\u dbContext.Devices.Where(device=>!device.AssignedDevices.Any())
您是否看过这个问题
\u dbContext.Devices
。Where(ad=>!\u dbContext.AssignedDevices
。选择(d=>d.DeviceId)
包含(ad.DeviceId)