我正在尝试使用Linq从搜索用户控件查询数据库。
我有这个Linq查询,用用户的输入搜索数据库。
这是我目前正在使用的代码:
var query = from invite in db.invites
where invite.Division == userInput.Division.Text &&
invite.Status == userInput.Status.Text
select invite;
我遇到的问题是,如果其中任何一个为空,我不需要考虑搜索过滤器。有没有办法正确地做到这一点,考虑到我有很多过滤器,而不仅仅是状态和分区?
答案 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