[英]How check length of related list inside Entity with EF Core and Include?
我有下一個結構類與相關列表(多 - 一個):
public class ContractorPpeItemHonestSign
{
[Key]
public int Id { get; set; }
...
[InverseProperty("ContractorPpeItemHonestSign")]
public virtual List<IssueHistoryHonestSign> IssueHistoryHonestSigns { get; set; }
}
}
我嘗試過濾所有 List.count == 0 的類,如下所示:
public class SignsWithFilterAndPaginationSpec : BaseSpecification<ContractorPpeItemHonestSign>
{
public SignsWithFilterAndPaginationSpec(SignsSpecParams signParams)
: base(x => x.ContractorId == signParams.ContractorId
&& x.DeletedDate == null
&& x.IssueHistoryHonestSigns.Count == 0)
{
AddInclude(x => x.IssueHistoryHonestSigns);
ApplyPaging(signParams.PageSize * (signParams.PageIndex - 1), signParams.PageSize);
}
}
}
public class SpcificationEvaluator<TEntity> where TEntity: class
{
public static IQueryable<TEntity> GetQuery(IQueryable<TEntity> inputQuery, ISpecification<TEntity> spec)
{
var query = inputQuery;
if (spec.Criteria != null)
{
query.Where(spec.Criteria);
}
if (spec.OrderBy != null)
{
query = query.OrderBy(spec.OrderBy);
}
if (spec.OrderByDesc != null)
{
query = query.OrderByDescending(spec.OrderByDesc);
}
if (spec.IsPaginataionEnabled)
{
query = query.Skip(spec.Skip).Take(spec.Take);
}
query = spec.Includes.Aggregate(query, (currentEntity, include) => currentEntity.Include(include));
return query;
}
}
但它不起作用;(((為什么以及如何實現這個目標?我也可以在內存中過濾結果,因為所有包含都完成了..但這不是我的情況。
另外我認為 WHERE 子句也不起作用......
你寫了:
我嘗試過濾 List.count == 0 的所有類
我想你的意思是:
要求:給定一個
IQueryable<ContractorPpeItemHonestSign>
,給我所有沒有IssueHistoryHonestSigns
ContractorPpeItemHonestSign
。
這個怎么樣:
IQueryable<ContractorPpeItemHonestSign> inputItems = ...
var inputItemsWithoutHonestSigns = inputItems
.Where(inputItem => !inputItem.IssueHistoryHonestSigns.Any());
換句話說:從對象 inputItems 中的 ContractorPpeItemHonestSigns 序列中,只保留那些根本沒有 IssueHistoryHonestSigns 的 ContractorPpeItemHonestSign。
實體框架將對表 ContractorPpeItemHonestSign 和 IssueHistoryHonestSigns 進行 GroupJoin,並且只保留那些根本沒有 IssueHistoryHonestSigns 的 ContractorPpeItemHonestSign。
如果您想自己進行IssueHistoryHonestSign.ContractorPpeItemHonestSignId
,請加入外鍵IssueHistoryHonestSign.ContractorPpeItemHonestSignId
:
IQueryable<ContractorPpeItemHonestSign> contractors = ...
IQueryable<IssueHistoryHonestSigns > issues = ...
var contractorsWithoutIssues = contractors.GroupJoin(issues,
contractor => contractor.Id, // from every contractor take the primary key
issue => issue.ContractorPpeItemHonestSignId, // from every issue take the foreign key to contractor
// parameter resultSelector, from every contractor with its zero or more issues
// make one new:
(contractor, issuesOfThisContractor) => new
{
// select all Contractor properties that you plan to use
Id = contractor.Id,
...
HasIssues = issuesOfThisContractor.Any(),
})
Where(contractor => !contractor.HasIssues);
第三種方法:
IQueryable<ContractorPpeItemHonestSign> contractors = ...
IQueryable<IssueHistoryHonestSigns > issues = ...
var contractorsWithoutIssues = contractors
.Where(contractor => !issues.Where(issue => issue.ContractorPpeItemHonestSignId == contractor.Id)
.Any());
換句話說:從所有承包商中,只保留那些沒有任何問題的承包商,這些問題的外鍵是指承包商的主鍵。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.