如何在LINQ中编写动态位置

时间:2011-07-19 06:41:11

标签: .net linq-to-sql

我有一个LinQ查询,如下所示

var filtered=from c in country
         where c.Id>=5
         select c;

现在我需要让运算符'> ='成为动态的,即运算符可能是'> ='或'=='或'< ='等等,具体取决于某个条件,查询应该基于该运算符执行。如何在LinQ中实现这一目标?

3 个答案:

答案 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) 可能会有所帮助。