我有一个LinQ查询,如下所示
var filtered=from c in country
where c.Id>=5
select c;
现在我需要让运算符'> ='成为动态的,即运算符可能是'> ='或'=='或'< ='等等,具体取决于某个条件,查询应该基于该运算符执行。如何在LinQ中实现这一目标?
答案 0 :(得分:3)
你可以这样做:
var filtered = country.AsQueryable();
if(cond == 0)
filtered = filtered.Where(c => c.Id <= 5);
else if(cond == 1)
filtered = filtered.Where(c => c.Id >= 5);
else if(cond == 2)
filtered = filtered.Where(c => c.Id == 5);
答案 1 :(得分:2)
我会避免使用“if-then-else”或“switch”方法,而是使用“词典”。
我假设您有一个允许用户选择数字(即5)的控件,因此您需要一种方法“动态”将其添加到查询中。
定义此词典:
var filters = new Dictionary<string,
Func<IQueryable<Country>, int, IQueryable<Country>>>()
{
{ ">", (cs, n) => cs.Where(c => c.Id > n) },
{ ">=", (cs, n) => cs.Where(c => c.Id >= n) },
{ "==", (cs, n) => cs.Where(c => c.Id == n) },
{ "<=", (cs, n) => cs.Where(c => c.Id <= n) },
{ "<", (cs, n) => cs.Where(c => c.Id < n) },
};
现在,您可以使用字典中的键填充下拉列表,然后通过执行以下操作即可轻松查询:
country = filters[">"](country, 5);
也许是这样的:
country = filters[dd.Value](country, int.Parse(tb.Text));
如果你想进一步解释,请大声说出来。
答案 2 :(得分:0)
这不正是您想要的,但我认为您所说的不安全并且不可读和< em>不可重复使用。出于这些目的,我总是尝试使用新方法并对它们void
。
public void static FilterById(int limit, string condition, IEnumerable filter, Type country)
{
var countryQueryable = country.AsQueryable();//Edit inspired by devio's comment on Mr.Hilgarth's answer.
switch(condition)
{
case(">") :
{
filter = countryQueryable .Where(q=>q.Id > 5)
break;
}
case(">=") :
{
filter = countryQueryable .Where(q=>q.Id >= 5)
break;
}
case("=") :
{
filter = countryQueryable .Where(q=>q.Id == 5)
break;
}
case("<=") :
{
filter = countryQueryable .Where(q=>q.Id <= 5)
break;
}
case("<") :
{
filter = countryQueryable .Where(q=>q.Id < 5)
break;
}
}
}
编辑: Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library) 可能会有所帮助。