Использование предиката Where для фильтрации detail.List с другим списком - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь получить набор записей Master-Detail на основе списка строк, которые мне нужно сопоставить со столбцом ссылочных номеров каждой детали для каждого мастера. Так, например, у меня есть это в виде списка строк:

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

и функция 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

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Я наконец разобрался с этим, так как здесь были задействованы составные первичные ключи, и правильный кортеж был невозможен. Я нашел решение с помощью этого вопроса: Невозможно создать связь между двумя таблицами с тремя первичными ключами

Мне удалось извлечь подмножество.

0 голосов
/ 07 мая 2018

Если я правильно понимаю, я прошу прощения, если у меня нет. Не могли бы вы использовать заявление о включении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...