【问题标题】:LINQ Select and Where not correctly returning any results?LINQ Select 和 Where 没有正确返回任何结果?
【发布时间】:2013-11-01 18:23:55
【问题描述】:

我正在尝试仅选择受访者已完成但无法使用我的代码执行此操作的某些预筛选。

代码:

 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]

我只是想将所有预筛选者放入一个列表中,该列表还将包括受访者的回复。我想我会创建一个新列表,然后将两个不同的列表组合起来,但是我的选择 Where is not working 我总是得到一个空的 testin 列表。

根据响应编辑代码:

我试过没有用

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

有效的答案在下面打勾!!!

【问题讨论】:

    标签: c# asp.net-mvc linq lambda


    【解决方案1】:

    您的for loop 是不必要的。就用这个吧:

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

    【讨论】:

    • PreScreenerResponse.Contains 的最佳重载方法匹配有一些无效参数错误
    • 我试过你的新编辑它有一个新错误。无法将 lambda 表达式转换为类型 Response,因为它不是委托类型。它在 psr => psr.PreScreenerId == x.Id 下闪烁
    【解决方案2】:
    for (int i = 0; i < respondent.PreScreenerResponses.Count; i++)
    {
        testin = project.PreScreeners.Where(x => x.Id == respondent.PreScreenerResponses[i].PreScreenerId);
    }
    

    这是 覆盖 testin 在每个循环上。

    {进一步分析以提供真正有用的东西}

    认为你想要:

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

    也可以

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

    【讨论】:

    • 我使用了你的方法而不使用 for 循环,并且 testin 仍然为空。我可以实际进入调试器并查看响应者并查看项目并实际看到它们确实共享一个共同的完全匹配 ID。但是测试总是无效的。我将在上面重新发布新代码
    • Where 永远不能返回 null。它可能会返回一个空集合,但不会返回 null
    • 很抱歉它正在返回空集合
    【解决方案3】:

    每次遍历 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));
    }
    

    【讨论】:

    • 当我做 testin.AddRange() 我得到一个错误。 Prescreener 不包含 AddRange 的定义,并且找不到接受 PreScreener 类型的第一个参数的扩展方法 AddRange。
    • 那个错误真的没有意义......你不应该在 Prescrenner 上调用 AddRange。它应该在 testin 上被调用。
    【解决方案4】:

    每次迭代,您都用查询返回的新值替换当前测试。最后它可能是空的,因为未找到列表中的最后一个元素,因此返回一个空查询。之前的所有值都被丢弃了。如果您想保留所有以前的值,您应该使用 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));
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2014-09-13
      • 2012-08-01
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多