在where子句中使用查询的LINQ查询

时间:2018-03-06 19:30:26

标签: .net sql-server asp.net-mvc linq c#-4.0

我想实现以下方案......

表1 - 数据库1的tAccessRequest 列 - RequestId,CardNo等...... 表2 - 数据库2的tBadge 专栏 - CardNo,CardStatus等......

我创建了一个Request Class,如下所示

public class RequestDetails
{
    public int RequestID { get; set; }

    public int RequestTypeID { get; set; }

    public string PersonID { get; set; }

    public int SectionCode { get; set; }

    public int RequestStateID { get; set; }

    public int ApprovalStatusID { get; set; }
}

现在我正在编写两个LINQ查询

List< RequestDetails > listReq = new List< RequestDetails >();

listReq = (from PP in DB1.tAccessRequests
                               where (PP.RequestStateID == 1 || PP.ApprovalStatusID == 1) && PP.SectionCode != null
                               select new RequestDetails
                               {
                                   RequestID = PP.RequestID,
                                   SectionCode = PP.SectionCode.Value 
                               }).ToList();

在我要实现的第二个LINQ查询中

var CardNoList = (from BC in prowatchContext.BADGE_C 
                                               where BC.STAT_COD != 'A' && BC.CARDNO in ("Select SectionCodefrom listReq"))

如何编写第二个LINQ查询..

请帮忙

2 个答案:

答案 0 :(得分:0)

您只需将Contains用于IN

var CardNoList = (from BC in prowatchContext.BADGE_C 
                  where BC.STAT_COD != 'A' &&
                        listReq.Select(lr => lr.SectionCode).Contains(BC.CARDNO)
                  ).ToList();

注意:如果listReq很大,除非您在客户端上执行Contains测试,否则这可能无效,在这种情况下,您可能需要使用HashSet

var reqCardNos = new HashSet<int>(listReq.Select(lr => lr.SectionCode));

var CardNoList = prowatchContext.BADGE_C.Where(BC => BC.STAT_COD != 'A')
                                        .AsEnumerable()
                                        .Where(BC => reqCardNos.Contains(BC.CARDNO))
                                        .ToList();

AsEnumerable会将所有匹配的行拉到客户端,然后对其进行过滤,因此如果BADGE_C非常大,这可能也无法正常工作,在这种情况下,您可能必须推送{ {1}}到临时表中的reqCardNos数据库,然后进行连接。

答案 1 :(得分:-1)

试试这个:

var CardNoList = from BC in prowatchContext.BADGE_C 
                                              join lr in listReq on BC.CARDNO equals lr.CardNo where BC.STAT_COD != 'A'
                                              select BC