【问题标题】:Using linq to filter a search使用 linq 过滤搜索
【发布时间】:2013-05-24 20:21:20
【问题描述】:

我正在尝试使用 Linq 从搜索用户控件中查询数据库。

我有一个使用用户输入搜索数据库的 Linq 查询。

这是我目前使用的代码:

var query = from invite in db.invites
            where invite.Division == userInput.Division.Text &&
                  invite.Status == userInput.Status.Text
            select invite;

我遇到的问题是,如果其中一个为空,我不需要将其考虑到搜索过滤器中。考虑到我有很多过滤器而不仅仅是状态和部门,有没有办法正确地做到这一点?

【问题讨论】:

标签: c# database linq search filter


【解决方案1】:

如果您想使用一些扩展,我已经构建了一个库以使其更具可读性。 https://www.nuget.org/packages/LinqConditionalExtensions

var hasDivision = !string.IsNullOrEmpty(userInput.Division.Text);
var hasStatus = !string.IsNullOrEmpty(userInput.Status.Text);

var query = db.Invites
    .WhereIf(hasDivision, invite => invite.Division == userInput.Division.Text)
    .WhereIf(hasStatus, invite => invite.Status == userInput.Status.Text);

您可以在此处阅读更多信息:https://github.com/xKloc/LinqConditionalExtensions

【讨论】:

    【解决方案2】:

    这应该可行:

    var query = from invite in db.invites
            where invite.Division.Matches(userInput.Division.Text) &&
                  invite.Status.Matches(userInput.Status.Text)
            select invite;
    

    static class Extensions
    {
        public static bool Matches(this string text, string value)
        {
          if(string.IsNullOrEmpty(value)) return true;
          return text == value; // or same safer comparison
        }
    }
    

    有更好的方法来构建查询,但这很简单(Matches 需要一个更好的名称)。

    正如@willem 所说,我错过了在数据库上执行的查询点,这似乎很可能 (db.invites) - 但是,我将答案留在这里,因为它适用于 Linq to Objects 查询。

    【讨论】:

      【解决方案3】:
      var query = from invite in db.invites
              where invite.Division.Contains(userInput.Division.Text) &&
                    invite.Status.Contains(userInput.Status.Text)
              select invite;
      

      var query = from invite in db.invites select invite;
      if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Division == userInput.Division.Text);
      if (!string.IsNullOrEmpty(userInput.Division.Text)) query = query.Where(invite => invite.Status == userInput.Status.Text);
      

      【讨论】:

      • 第一个示例的行为方式与原始示例不同
      • 你说得对,尽管他的问题告诉我他可能正在寻找那个解决方案。
      • 我无法评论您的帖子( !@%@#$^@#$^@#$^ )但您的解决方案不会说 sql server 不会重新调整您的函数,因为它是只在应用程序内部而不是在 SQL 服务器上运行的代码?
      • 我什至没有考虑这与 SQL 相关的可能性 :) 您可能是对的,但对于任何 Linq to Objects 查询,答案都是正确的。我会编辑它。
      • 我正在使用 Linq to Sql。我可能忘记指定了。
      【解决方案4】:

      由于延迟执行,您可以有条件地分段构建查询。

      var query = db.invites.AsQueryable();
      
      if(!string.IsNullOrEmpty(userInput.Division.Text))
          query = query.Where(invite => invite.Division == userInput.Division.Text);
      
      if(!string.IsNullOrEmpty(userInput.Status.Text))
          query = query.Where(invite => invite.Status== userInput.Status.Text);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多