c# - 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
?
数据必须在我已经写过的同一个选择中选择。
感谢您的回答。
解决方案
要解决您的问题,您需要进行左连接而不是内连接。这是在 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 在他的评论中所说的。
推荐阅读
- sql - IF NULL 从另一个表中选择数据
- java - java .properties 文件中的“@”有什么用
- dependencies - 使用 buildroot 工具链进行交叉编译时,已安装的库“丢失”
- c++ - 使用 grpc 构建项目时 gitlab 中的错误
- javascript - 我的 OR 运算符似乎无法正常工作 - 初学者
- javascript - 如何递归嵌套对象值,以使父对象包含相应的命名集合?
- android - 在 Android Studio 中测量高度无法正常工作
- jquery - 我无法在 vscode 上设置 jQuery
- javascript - 如何自定义内置的 javascript 函数?
- powerbi - 无法将变量放入导出的 Excel 数据集中的值框中