【问题标题】:Search - IQueryable Linq搜索 - IQueryable Linq
【发布时间】:2012-07-30 14:13:49
【问题描述】:

我正在创建一个搜索成员的函数,并且我想在我的 searchResults 变量中添加一个 Where。但是,在我这样做之前,它可能需要是一个 IQueryable。

这就是我想要完成的:

var searchResults = listMembers.DataSource = members.getAllMembers().OrderByDescending(x => x.createdDate).Select(x => new
    {
        x.ID,
        x.memberNumber,
        x.name,
        x.email,
        x.birthDate,
        hasPayed = Helper.renderBoolImage(x.hasPayed, true),
        isConfirmed = Helper.renderBoolImage(x.isConfirmed, true),
        isExportedToExcel = Helper.renderBoolImage(x.isExportedToExcel, true)
    });

    if (!String.IsNullOrEmpty(search.name))
    {
        searchResults = searchResults.Where(x => x.name.ToLower().Equals(enc(search.name.ToLower())));
    }

这一行无法编译,因为它无法解析 Where:

searchResults = searchResults.Where(x => x.name.ToLower().Equals(enc(search.name.ToLower())));

【问题讨论】:

  • 对于不区分大小写的相等检查,请使用a.Equals(b, StringComparison.InvariantCultureIgnoreCase)(或其他文化,如果合适)。如果必须自己转换字符串,则应使用ToUpperInvariant 而不是ToLower。见Best Practices for Using Strings in the .NET Framework
  • @phoog 感谢您的建议! :)

标签: c# linq search


【解决方案1】:

这就是问题所在:

var searchResults = listMembers.DataSource = members.getAllMembers()...

你应该使用:

var searchResults = members.getAllMembers()...;

if (!String.IsNullOrEmpty(search.name))
{
    searchResults = searchResults.Where(...);
}

listMembers.DataSource = searchResults;

目前searchResults的类型与listMembers.DataSource的类型相同,不是members.getAllMembers...的类型

一般来说,我建议不要像您的原始代码 (x = y = z) 那样进行多次分配 - 正如您所发现的那样,这会使代码更加混乱......

【讨论】:

  • 感谢您的回复。你会如何建议我应该执行这个操作 - 因为你不喜欢多重赋值。搜索对象包含我需要检查的另外 6 个值,所以它不仅仅是名称。
  • @KLIM8D:不清楚你的意思。您想要DataSource 属性设置为未过滤的值吗?不清楚为什么要使用多重赋值。
  • 在此方法结束时,我想将DataSource 属性设置为过滤后的值(searchResults)。变量search 是一个内部类,它包含 6 个变量——它们都可以为空。不确定我是否需要搜索此搜索对象中的所有内容 - 因为其中一些可能为空。所以我想到的是 6 个与主题中的几乎相似的 if 语句。
  • @KLIM8D:听起来你想要我写的代码,但里面还有另外 5 个“if”语句......
  • 是的,这就是我计划的编码方式,但是既然你写了In general I'd advise against multiple assignments like this - it makes the code more confusing, as you've found... - 我想你可能有更好的方法来编写这段代码:)
【解决方案2】:

您的文件顶部是否有using System.Linq;?您是否至少使用 .NET 3.5?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2010-11-06
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多