0

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

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

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

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

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

4

4 回答 4

5

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

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);
于 2013-05-29T14:13:40.410 回答
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 查询。

于 2013-05-29T14:22:28.410 回答
0
var query = from invite in db.invites
        where invite.Division.Contains(userInput.Division.Text) &&
              invite.Status.Contains(userInput.Status.Text)
        select invite;

or

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);
于 2013-05-29T14:17:15.893 回答
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

于 2019-01-10T19:03:07.913 回答