使用linq过滤搜索

时间:2013-05-29 14:08:42

标签: c# database linq search filter

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

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

这是我目前正在使用的代码:

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

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

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

这应该有效:

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查询。

答案 2 :(得分:0)

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);

答案 3 :(得分:0)

如果您想使用一些扩展名,我已经建立了一个库来使它更具可读性。 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