1

以下のコードでは、n 行を返すことを期待していますが、最初のセットにレコードがないため、常に 0 行を返します。理想的には、UNION ALL を実行して、整数リストのすべての整数のレコードを返す必要があります。

    var tbl = (from a in db.Applicants
    where a.Id == null
    select new { a.Id, a.Firstname, a.Lastname });
    int thisTag;
    foreach (int c in clearanceTotals)
    {
        switch (c)
        {
            case 6:
                thisTag = 38;
                break;
            case 8:
                thisTag = 39;
                break;
            case 17:
                thisTag = 39;
                break;
            case 7:
                thisTag = 42;
                break;
            case 9:
                thisTag = 44;
                break;
        }
        tbl = (from a in db.Applicants
               join ad in db.ApplicantDeployments on a.Id equals ad.ApplicantId
               join aa in db.ApplicantAttachments on a.Id equals aa.ApplicantId
               where a.Nationality == 15 && a.DoNotUse == false && a.ClearanceStatus == c
               && aa.Tag == thisTag
               select new { a.Id, a.Firstname, a.Lastname }).Union(tbl);
    }
4

2 に答える 2

1

問題は、クエリでループ変数 ( ) をキャプチャしていることだと思います。cそのため、クエリが実行されると、c の最新の値のみが使用されます。c をループ内の変数にコピーしてみてください。

foreach (int c in clearanceTotals)
{
    int c2 = c;
    ...

        ...
        where a.Nationality == 15 && a.DoNotUse == false && a.ClearanceStatus == c2
        ...
于 2012-04-19T18:58:04.843 に答える
0

わかりましたので、これを機能させましたが、追加のコードと追加の変数

var temp = (from a in db.Applicants 
where a.Id == null 
select a.Id).ToList(); 

int thisTag; 
foreach (int c in clearanceTotals) 
{ 
    switch (c) 
    { 
        case 6: 
            thisTag = 38; 
            break; 
        case 8: 
            thisTag = 39; 
            break; 
        case 17: 
            thisTag = 39; 
            break; 
        case 7: 
            thisTag = 42; 
            break; 
        case 9: 
            thisTag = 44; 
            break; 
    }
    temp = temp.Union(from a in db.Applicants 
           join ad in db.ApplicantDeployments on a.Id equals ad.ApplicantId 
           join aa in db.ApplicantAttachments on a.Id equals aa.ApplicantId 
           where a.Nationality == 15 && a.DoNotUse == false && a.ClearanceStatus == c 
           && aa.Tag == thisTag 
           select a.Id).ToList(); 
}
var tbl = (from a in db.Applicants
                      join ad in db.ApplicantDeployments on a.Id equals ad.ApplicantId
                      where temp.Contains(a.Id) 
                      select new { a.Id, a.Firstname, a.Lastname }).Distinct(); 
于 2012-04-20T13:17:40.927 に答える