我正在使用 .net core 3.1 构建一个应用程序。我想显示一个资产列表,包括每个资产最后一次视觉检查和全面PAT测试的日期。
我正在使用以下表格/模型:
public class Asset
{
public int AssetID { get; set; }
public string Title { get; set; }
public int AssetCatID { get; set; }
public string Manufacturer { get; set; }
public bool RequiresPAT { get; set; }
public AssetCat AssetCat { get; set; }
public PAT PAT { get; set; }
}
public class AssetCat
{
public int AssetCatID { get; set; }
public string CategoryTitle { get; set; }
public virtual ICollection<Asset> Assets { get; set; }
}
public class PAT
{
public int PATID { get; set; }
public int AssetID { get; set; }
public int CheckTypeID { get; set; }
public DateTime CheckDate { get; set; }
public string CheckedBy { get; set; }
public Asset Asset { get; set; }
public CheckType CheckType { get; set; }
}
这里没有包括CheckType表,但是CheckTypeID 1 = 全面测试,CheckTypeID 2 = 目视测试。
需要进行PAT的每个资产都将有两种类型的测试的多个条目,并且我需要列出每种类型的最后一次测试的日期以及相应的资产。
var AssetQuery = _context.Assets
.Where(a => a.RequiresPAT)
.Include(a => a.AssetCat)
.Include(a => a.PAT) // needs to just include latest PAT record where CheckTypeID = 1 if it exists AS FullPAT
.Include(a => a.PAT) // needs to just include latest PAT record where CheckTypeID = 2 if it exists AS VisualCheck
.ToListAsync();
我看到在EF 5中可以使用包含的.Where,但还没有可用。我尝试过在PAT记录上使用类似于.OrderByDecending(p => p.CheckDate).FirstorDefault()的变体,但我就是想不出如何把它们组合起来。
我想返回一个模型,用在索引样式页面上,最好显示类似于:
Model.Asset.AssetID | Model.Asset.AssetTitle | Model.Asset.AssetCat.CategoryTitle | Model.Asset.FullPat.CheckDate | Model.Asset.VisualCheck.CheckDate
我对 .net / ef / c# 还很陌生,所以希望能得到一些指导。我知道如何在经典 ASP 中使用 SQL 编写视图,但尝试找出 .net core 的最佳方法。
.Include(c => c.PAT .Where(p => p.CheckTypeID == 1).OrderByDescending(p => p.CheckDate).Take(1))
这一行代码,效果很好。关于尝试使用两个不同过滤器(一个是CheckTypeID = 1,另一个是CheckTypeID = 2)来包含PAT,您知道是否有一种别名包含的机制吗? - Matt