簡體   English   中英

如何使用 EF Core 和 Include 檢查實體內相關列表的長度?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM