通过检查 table 中的先前条目创建所有可用资产的列表
Create a list of all available assets by checking previous entries in table
我有一系列模型用于跟踪我们数据库中的资产。但是,此过程涉及的主要两个是 Computer
和 ComputerTracking
。 ComputerTracking
在名为 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();
我有一系列模型用于跟踪我们数据库中的资产。但是,此过程涉及的主要两个是 Computer
和 ComputerTracking
。 ComputerTracking
在名为 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();