【问题标题】:Using Where predicate to filter detail.List with another list使用 Where 谓词过滤 detail.List 与另一个列表
【发布时间】:2018-10-16 15:22:04
【问题描述】:

我正在尝试根据我需要与每个主控的每个详细信息的参考号列匹配的字符串列表来获取一组主从记录。因此,例如,我将其作为字符串列表:

string[] listToFilterFor = new [] { "2729113", "2732623", "2734483", "2735355", "2752260" };

Anf 要过滤的 DAL 函数:

public async Task<IQueryable<BILL_INFO>> GetBills(IDictionary<string, object> filterCriteria, string operationGuid)
{
    var callerInfo = Shared.CommonAcross.Helper.GetCaller();
    Logger.Info($"{LayerName} -> {callerInfo.MethodName} -> Started");

    try
    {
        IList<BILL_INFO> intermResult;

        using (var context = new FinanceConnection())
        {
            var result = context.BILL_INFOS
                                .Include(i => i.MASTER_ACCOUNT)
                                .Include(i => i.MASTER_PAY_MODE)
                                .Include(i => i.MASTER_BANK)
                                .Include(i => i.MASTER_CREDIT_CARD_TYPE)
                                .Include(i => i.MASTER_EDIRHAM_CARD_TYPE);

            if (filterCriteria != null && filterCriteria.Any())
            {
                #region Keys

                var billNumberKey = "BillNumber";
                var cashierNumberKey = "AssignedCashiers";
                var payModeIdKey = "PayModeId";
                var depositIdKey = "DepositId";
                var dateFromKey = "DateFrom";
                var dateToKey = "DateTo";
                var accountsKey = "Account";
                var accountGroupsKey = "AccountGroups";
                var referenceNumber = "ReferenceNumber";
                var referenceNumbers = "ReferenceNumbers";

                #endregion

                if (filterCriteria.ContainsKey(billNumberKey) && filterCriteria.TryGetValue(billNumberKey, out var actualFilterBillNumber))
                    result = result.Where(where => where.BILL_NUMBER.Contains(actualFilterBillNumber.ToString()));

                if (filterCriteria.ContainsKey(referenceNumbers) && filterCriteria.TryGetValue(referenceNumbers, out var actualReferenceNumbers))
                {
                    result = result.Include(i => i.BILL_INFO_DETAIL);
                    result = result.Where(where => where.BILL_INFO_DETAIL.Any(p=>p.));
                }

                #region From/To Dates

                DateTime? tempDateFrom = null;
                DateTime? tempDateTo = null;

                if (filterCriteria.ContainsKey(dateFromKey) && filterCriteria.TryGetValue(dateFromKey, out var actualDateFrom))
                {
                    tempDateFrom = ((DateTime?)actualDateFrom)?.Date;
                }

                if (filterCriteria.ContainsKey(dateToKey) && filterCriteria.TryGetValue(dateToKey, out var actualDateTo))
                {
                    tempDateTo = ((DateTime?)actualDateTo)?.Date.AddDays(1).AddMilliseconds(-1);
                }

                if (tempDateFrom.HasValue && tempDateTo.HasValue)
                {
                    result = result.Where(where => where.BILL_DATE != null && where.BILL_DATE >= tempDateFrom && where.BILL_DATE <= tempDateTo);
                }
                else if (tempDateFrom.HasValue && !tempDateTo.HasValue)
                {
                    result = result.Where(where => where.BILL_DATE != null && where.BILL_DATE >= tempDateFrom && where.BILL_DATE <= tempDateFrom);
                }
                else if (!tempDateFrom.HasValue && tempDateTo.HasValue)
                {
                    result = result.Where(where => where.BILL_DATE != null && where.BILL_DATE >= tempDateTo.Value.Date && where.BILL_DATE <= tempDateTo);
                }

                #endregion
            }

            intermResult = await result.OrderByDescending(o => o.BILL_DATE).Take(10000).ToListAsync();
        }

        Logger.Info($"{LayerName} -> {callerInfo.MethodName} -> Returning");
        return intermResult.AsQueryable();
    }
    catch (Exception exp)
    {
        Logger.Error($"{LayerName} -> {callerInfo.MethodName} -> Exception [{exp.Message}]", exp);
        throw;
    }
}

任务:

我需要查看主记录 (BILL_INFOS) 并查看每个主记录的详细记录 (BILL_INFO_DETAILS) 并尝试将 AnyOf listToFilterFor 与 BILL_INFO_DETAIL.REFERENCE_NUMBER 进行匹配

【问题讨论】:

  • 您必须获取BillInfos,其详细信息与listToFilterFor中的任何一个匹配,或者获取匹配的特定详细信息??
  • @Kacper 主记录(BillInfos 的细节满足 cruteria)
  • 你能展示一下,Bill_Info 实体是什么样的吗? Bill_Info_Details 是另一个实体吗?

标签: c# sql-server entity-framework-6 c#-7.1


【解决方案1】:

如果我理解正确,如果我没有理解,我深表歉意。您可以使用包含语句吗?

BILL_INFO.where(x => listToFilterFor.Includes(x.BILL_INFO_DETAILS.REFERENCE_NUMBER)

【讨论】:

  • string[] listToFilterFor 没有 .Include() 方法
  • 你需要先 .toList() 数组
  • 这样做了,但 x.BILL_INFO_DETAILS 是一个集合,我无法以这种方式访问​​属性 REFERENCE_NUMBER
  • 对不起,我在想 javascript 它实际上是 .contains()
  • 可以使用 selectMany 运算符吗?
【解决方案2】:

我终于把这个整理出来了,因为这里涉及到复合主键,并且不可能有正确的元组。我通过这个问题找到了解决方案:Cannot create a relation between two tables with three primary keys

我能够提取一个子集。

【讨论】:

    猜你喜欢
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多