LINQ 方法的问题不返回任何结果

Posted

技术标签:

【中文标题】LINQ 方法的问题不返回任何结果【英文标题】:problems with LINQ method not returning any results 【发布时间】:2020-11-22 05:29:09 【问题描述】:

目前我的列表中的 LINQ 查询未返回搜索结果。我试图向该方法传递一个字符串,它在其中搜索每个对象FirstName, LastName, and Username 字段。 这是我的方法:

        public IEnumerable<Volunteer> Search(string key)
        
            IEnumerable<Volunteer> searchResults = _volunteerList.Where(v => v.FirstName == key 
                                                                        || v.LastName == key 
                                                                        || v.Username == key);

            return searchResults;
        

我已验证字符串 key 正在被传递到方法中,并且包含正确的值“Bob”。

这是我_volunteerList 中的对象列表:

                new Volunteer id = 1, FirstName = "Bob", LastName = "Evans", Username = "BEvans", Password= "1991", StreetAddress = "1995 StreetName Ave", State = "FL", City = "Jacksonville", ZipCode = 32225, ApprovalStatus = "Approved",
                new Volunteer id = 2, FirstName = "Jim", LastName = "Evans", Username = "JEvans", Password= "1992", StreetAddress = "1995 StreetName Ave", State = "FL", City = "Jacksonville", ZipCode = 32225, ApprovalStatus = "Approved"

对我来说,从我查找的所有内容来看,LINQ 语句的语法看起来是正确的,并且没有返回任何错误(至少在 VS19 中)。有什么我想念的吗?

提前致谢。

仅供参考:相关方法/代码:

Homecontroller - Search()

        [HttpGet]
        public ActionResult Search(string key)
        

            IEnumerable<Volunteer> results = _volunteerRepository.Search(key);

            ViewData.Model = results;
            return View("SearchResults");
        

ManageVolunteers(查看)- 表单

<form method="get" asp-action="Search" >
    <table>
        <tr>
            <td><input type="text" placeholder="Search" name="Key" value ="Bob" class="form-control"/> </td>
            <td><input type="submit" value="Search" class="btn btn-primary"></td>
        </tr>
    </table>
</form>

【问题讨论】:

下断点调试时是否显示key的预期值? 无法重现。唯一想到的是大小写不同。 "bob" vs "Bob" == 比较区分大小写。 就像@Steve,我无法重现。我对区分大小写也有同样的看法。要检查的另一件事是在执行 where 语句之前 _volunteerList 是否有任何值。 【参考方案1】:

坦率地说...我不知道我做了什么,但现在正确的输出显示在我的 SearchResults 视图中。

一切都是正确的。我不知道为什么,但在上传结果列表之前进行了几个小时的工作后,结果列表正确显示。

感谢您尝试提供的帮助。

【讨论】:

你应该接受你的答案(点击这个答案左边的复选框) 我计划...但根据 *** 网站 2 天不能接受我自己的答案 哦,是的,我忘了:) 因为这个问题和相关答案都不是可以以任何方式复制的东西,所以最好的方法是删除问题。没有未来的读者可以在这里找到任何价值。见xkcd.com/979【参考方案2】:

您已将 _volunteerList 声明为 List&lt;Volunteer&gt;IEnumerable&lt;Volunteer&gt; ?似乎存在一些类型转换问题。尝试在使用 IEnumerable&lt;Volunteer&gt; 的任何地方保留 List&lt;Volunteer&gt;。看看这是否有效。

【讨论】:

【参考方案3】:

我最近遇到了同样的问题,我所做的就是把它放在我的 IEnumerable 的末尾。一个 ToList();

IEnumerable<Volunteer> searchResults = _volunteerList.Where(v => v.FirstName == key 
                                                                        || v.LastName == key 
                                                                        || v.Username == key).ToList();

【讨论】:

这只是将结果转换为列表。它不能解决任何问题。 正如@Andy 提到的,如果 iinq 查询没有返回结果,则转换为 list 不会执行任何操作。投射到列表会带来不同的好处,例如可以对集合进行更改(IEnumerable 是只读的,总体开销较低),但这不是问题要问的。 @VytautasPlečkaitis -- 当然我知道列表是如何工作的。但简单地将集合转换为列表并不会神奇地使项目出现,这正是我想要传达的。 @Andy 我完全同意,该评论是针对 Otavio 的。

以上是关于LINQ 方法的问题不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

结果为空时LINQ返回啥

使用 LINQ 保持顺序

返回 LINQ 查询结果的控制器方法

动态 linq:创建生成 JSON 结果的扩展方法

linq-select 具有所有条件的行

将 LINQ 的 Zip 与不返回值的闭包一起使用