通过检查 table 中的先前条目创建所有可用资产的列表

Create a list of all available assets by checking previous entries in table

我有一系列模型用于跟踪我们数据库中的资产。但是,此过程涉及的主要两个是 ComputerComputerTrackingComputerTracking 在名为 AssetActionsId 的字段中保存了每台特定计算机执行的所有操作的列表。 AssetActionId 指的是另一个简单地保存动作的模型。

目前只有三个动作:

-----------------------
|ID    AssetActionName|
-----------------------
|1     Check In       |
|2     Check Out      |
|3     Decommission   |
-----------------------

我需要一种显示 Computer 可用的所有计算机的方法。例如,它们的状态为 Check In 或从未被检出或退役。

我的 ComputerTracking 模型是:

public partial class ComputerTracking
{
    public int Id { get; set; }
    [DisplayName("Computer")]
    public int ComputerId { get; set; }
    [DisplayName("Employee")]
    public int EmployeeId { get; set; }
    [DisplayName("Condition")]
    public int ConditionId { get; set; }
    [DisplayName("Condition Notes")]
    public string ConditionNotes { get; set; }
    [DisplayName("Date Entered")]
    public DateTime? EnteredDate { get; set; }
    [DisplayName("Action")]
    public int AssetActionId { get; set; }
    [DisplayName("Last Modified")]
    public DateTime? LastModified { get; set; }

    public virtual AssetAction AssetAction { get; set; }
    public virtual Computer Computer { get; set; }
    public virtual Condition Condition { get; set; }
}

我的控制器使用以下方法生成所有计算机的列表:

ViewBag.ComputerIdentifier = db.Computers.ToList().Select(t => new GroupedSelectListItem
{
    GroupKey = t.ComputerModel.Manufacturer.Id.ToString(),
    GroupName = t.ComputerModel.Manufacturer.ManufacturerName,
    Text = t.ComputerIdentifier,
    Value = t.Id.ToString()
});

编辑:

这是一个 SQL 查询,它完全符合我的要求:

USE shop_db
SELECT  t1.id
        ,t1.ComputerModelId
        ,t1.SerialNumber
FROM    asset.Computer t1
LEFT JOIN asset.ComputerTracking t2 
        ON t1.id = t2.ComputerId
WHERE   t1.id NOT IN(SELECT ComputerId FROM asset.ComputerTracking)
        OR t2.AssetActionId=1

对实体使用 linq:

using (TheContext db = new TheContext())
{
    List<Computer> compQuery = (from compTrack in db.compTracking
                               where compTrack.AssetActionId == 1  // or compTrack.AssetAction.ID presumably
                               select compTrack.Computer).ToList();
}

在对 linq 进行一些研究之后,我根据 wahwahwah 的回答提出了一个相当可靠的解决方案。我简单地复制了原始 post 中的 SQL 查询并将其转录到 linq.

List<Computer> compQuery = (from comps in db.Computers
    join compTrack in db.ComputerTrackings on comps.Id equals compTrack.Computer.Id into compT
    from compTrack1 in compT.DefaultIfEmpty()
    where !(from o in db.ComputerTrackings
        select o.ComputerId).Contains(comps.Id) || compTrack1.AssetAction.Id == 1
    select comps).ToList();