C# 使用Where谓词筛选包含其他列表的详细信息.List

C# 使用Where谓词筛选包含其他列表的详细信息.List,c#,sql-server,entity-framework-6,c#-7.1,C#,Sql Server,Entity Framework 6,C# 7.1,我试图在字符串列表的基础上获得一组主细节记录,这些字符串需要与每个主细节的参考编号列相匹配。例如,我将其作为字符串列表: string[] listToFilterFor = new [] { "2729113", "2732623", "2734483", "2735355", "2752260" }; Anf要过滤的DAL函数: public async Task<IQueryable<BILL_INFO>> GetBills(IDictionary<stri

我试图在字符串列表的基础上获得一组主细节记录,这些字符串需要与每个主细节的参考编号列相匹配。例如,我将其作为字符串列表:

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;
    }
}
公共异步任务GetBills(IDictionary filterCriteria,string operationGuid) { var callerInfo=Shared.CommonCross.Helper.GetCaller(); Logger.Info($“{LayerName}->{callerInfo.MethodName}->Started”); 尝试 { 结果; 使用(var context=new FinanceConnection()) { var result=context.BILL\u INFOS .包括(i=>i.MASTER\u账户) .Include(i=>i.MASTER\u PAY\u模式) .包括(i=>i.MASTER\u银行) .包括(i=>i.MASTER\u信用卡类型) .包括(i=>i.MASTER\u EDIRHAM\u卡类型); if(filterCriteria!=null&&filterCriteria.Any()) { #区域键 var billNumberKey=“BillNumber”; var cashierNumberKey=“已分配出纳”; var payModeIdKey=“PayModeId”; var depostidkey=“depostiid”; var dateFromKey=“DateFrom”; var dateToKey=“DateTo”; var accountsKey=“Account”; var accountGroupsKey=“AccountGroups”; var referenceNumber=“referenceNumber”; var referenceNumbers=“referenceNumbers”; #端区 if(filterCriteria.ContainsKey(billNumberKey)和&filterCriteria.TryGetValue(billNumberKey,out var实际FilterBillNumber)) result=result.Where(Where=>Where.BILL_NUMBER.Contains(actualFilterBillNumber.ToString()); if(filterCriteria.ContainsKey(referenceNumbers)和&filterCriteria.TryGetValue(referenceNumbers,out-var-actualReferenceNumbers)) { 结果=结果。包括(i=>i.BILL\u信息\u详情); result=result.Where(Where=>Where.BILL\u INFO\u DETAIL.Any(p=>p.); } #区域开始/结束日期 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.addmillizes(-1); } if(tempDateFrom.HasValue&&tempDateTo.HasValue) { result=result.Where(Where=>Where.BILL_DATE!=null&&Where.BILL_DATE>=tempDateFrom&&Where.BILL_DATE Where.BILL_DATE!=null&&Where.BILL_DATE Where.BILL_DATE>=tempDateTo.Value.DATE&&Where.BILL_DATE o.BILL_DATE!=Take(10000).tolistsync(); } Logger.Info($“{LayerName}->{callerInfo.MethodName}->返回”); 返回intermResult.AsQueryable(); } 捕获(异常扩展) { Logger.Error($“{LayerName}->{callerInfo.MethodName}->异常[{exp.Message}]”,exp); 投掷; } } 任务:


我需要查看主记录(
BILL\u INFOS
)并查看每个主记录的详细信息(
BILL\u INFO\u DETAILS
),并尝试将任何列表过滤器与BILL\u INFO\u DETAILS匹配。参考编号如果我理解正确,如果我没有理解,我很抱歉。您可以使用include语句吗


BILL\u INFO.where(x=>listToFilterFor.Includes(x.BILL\u INFO\u DETAILS.REFERENCE\u NUMBER)

我终于把这个问题解决了,因为这里涉及到复合主键,无法找到合适的元组。我通过这个问题找到了解决方案:


我能够提取一个子集。

您必须获取BillInfos,其详细信息与列表中的任何一个相匹配,或者特定于特定于列表的详细信息与之匹配???@Kacper主记录(BillInfos,其详细信息满足cruteria)您可以显示,Bill\u信息实体看起来像什么?Bill\u信息详细信息是另一个实体吗?
字符串[]listToFilterFor
没有一个
.Include()
方法您需要。toList()数组首先这样做,但是x.BILL\u INFO\u详细信息是一个集合,我无法访问属性引用号。对不起,我想的是javascript,它实际上是。contains()您可以使用selectMany操作符吗?