2013-11-01 54 views
0

我想挑选出只有受访者已经完成的某些预审工,但一直无法使用我的代码。LINQ选择和哪里不正确返回任何结果?

CODE:

IEnumerable<PreScreener> testin = new List<PreScreener>(); 
       for (int i = 0; i < respondent.PreScreenerResponses.Count; i++) 
       { 
        testin = project.PreScreeners.Where(x => x.Id == respondent.PreScreenerResponses[i].PreScreenerId); 
       } 

模型:

public class PreScreener : IHasId, IHasProjectId 
    { 
     public int? Id { get; set; } 

     public int? ProjectId { get; set; } 

     public string ExternalId { get; set; } 

     public string Name { get; set; } 

     public int? PartialCount { get; set; } 

     public int? DisqualifiedCount { get; set; } 

     public int? CompleteCount { get; set; } 

     public DateTime? CreatedOn { get; set; } 

     public DateTime? UpdatedOn { get; set; } 

     public List<PreScreenerQuestion> Questions { get; set; } 
    } 



public class PreScreenerResponse : IHasId, IHasProjectId 
{ 
    public int? Id { get; set; } 

    public int? ProjectId { get; set; } 

    public int? PreScreenerId { get; set; } 

    public int? RespondentId { get; set; } 

    public string Ip { get; set; } 

    public DateTime SubmittedDate { get; set; } 

    public DateTime CreatedOn { get; set; } 

    public double? Latitude { get; set; } 

    public double? Longitude { get; set; } 

    public Dictionary<short, PreScreenerQuestionResponse> Response { get; set; } 
} 

Respondent.PreScreenerResponses [I] < --Prescreeners响应Prescreeners Project.PreScreeners [I] < - 所有Prescreeners属于到项目

我很简单只想把所有的Prescreeners,并把它们放入一个L这也将包括受访者的回应。我想我会做一个新的列表,然后结合两个不同的列表,但我选择哪里不工作我总是得到一个空的testin列表。

编辑的代码基于响应:

我想这无济于事

 IEnumerable<PreScreener> testin = new List<PreScreener>(); 
     testin = project.PreScreeners.Where(p => respondent.PreScreenerResponses 
                  .Select(r => r.PreScreenerId) 
                   .Contains(p.Id)); 

奏效如下勾掉答案!

回答

3

for loop是不必要的。只需使用这个:

testin = project.PreScreeners.Where(x => respondent.PreScreenerResponses.Any(psr => psr.PreScreenerId == x.Id)).ToList(); 
+0

PreScreenerResponse.Contains的最佳重载方法匹配有一些无效参数错误 – allencoded

+0

@allencoded编辑。 – gleng

+0

我试过你的新编辑它有一个新的错误。无法将lambda表达式转换为类型Response,因为它不是委托类型。它扭曲在psr => psr.PreScreenerId == x.Id – allencoded

1
for (int i = 0; i < respondent.PreScreenerResponses.Count; i++) 
{ 
    testin = project.PreScreeners.Where(x => x.Id == respondent.PreScreenerResponses[i].PreScreenerId); 
} 

这是覆盖testin在每个循环。

{进一步分析提供sometihng这其实很有帮助}

想你想要

project.PreScreeners 
     .Where(p => respondent.PreScreenerResponses 
          .Select(r => r.PreScreenerId) 
          .Contains(p.Id) 
      ) 

或altrenately

project.PreScreeners 
     .Join(respondent.PreScreenerResponses, 
      p => p.Id 
      r => r.PreScreenerId 
      ) 
     .Select((p, r) => p); // select just the PreScreener 
+0

我用过你的方法,而不使用for循环,并且testin仍然为空。我可以身体进入dubugger,然后对受访者lo and不安,看看项目,并且看到他们确实有一个共同的完全匹配id。但测试始终为空。我将重新发布 – allencoded

+0

以上的新代码'Where'永远不会返回null。它可能会返回一个空集合,但不是'null'。 –

+0

对不起,它正在返回空收集 – allencoded

0

你每次迭代你的for循环时都重新分配你的列表。我想你应该这样做:

IEnumerable<PreScreener> testin = new List<PreScreener>(); 
for (int i = 0; i < respondent.PreScreenerResponses.Count; i++) 
{ 
    testin.AddRange(project.PreScreeners.Where(x => x.Id == respondent.PreScreenerResponses[i].PreScreenerId)); 
} 
+0

当我做testin.AddRange()时出现错误。 Prescreener不包含AddRange的定义,也没有可以找到接受PreScreener类型的第一个参数的扩展方法AddRange。 – allencoded

+0

这个错误没有任何意义......你不应该在Prescrenner上调用AddRange。它应该被调用testin。 – lehn0058

0

每次迭代,您将用您的查询返回的新值替换当前的testin。最后它可能是空的,因为你的列表中的最后一个元素没有找到,因此返回一个空查询。之前的所有价值都被抛弃了。如果你想保留所有以前的值,你应该使用concat(或者如果你关心唯一性,则使用union)。

IEnumerable<PreScreener> testin = new List<PreScreener>(); 
for (int i = 0; i < respondent.PreScreenerResponses.Count; i++) 
{ 
    testin = testin.Concat(project.PreScreeners.Where(x => x.Id == respondent.PreScreenerResponses[i].PreScreenerId)); 
}