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)
)代码>