使用Entity Framework按整数过滤结果

时间:2017-12-14 11:06:13

标签: c# asp.net-mvc entity-framework checkbox filtering

我有一个MVC项目,我正在使用实体框架。

我在数据库中有一些数据需要使用复选框按整数变量(时间)进行过滤。我收到一条错误消息:

  

参数字典包含方法'System.Web.Mvc.ViewResult索引(System.String,System.String,System.String [])的非可空类型'System.Int32'的参数'time'的空条目,Int32)'在'LazyRecipe.DAL.RecipesController'中。可选参数必须是引用类型,可空类型,或者声明为可选参数。   参数名称:参数

如何过滤数据?

// GET: Recipes
    public ViewResult Index(string sortOrder, string searchString, string[] FilteredsearchString, int time)
    {   
        IQueryable recipes;
        if (String.IsNullOrEmpty(searchString))
        {
            recipes = db.Recipes.Include("Ingredients");
        }
        else
        {
            FilteredsearchString = searchString.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries);

            // "string" can be lowercase.
            Console.WriteLine(string.Join(",", FilteredsearchString));

            // ... "String" can be uppercase.
            Console.WriteLine(String.Join(",", FilteredsearchString));

            recipes = db.Recipes.Where(r => r.Ingredients.Any(i => FilteredsearchString.Contains(i.Ingredi‌​entName)));
        }

        switch(time)
        {


            case 30:
            recipes = db.Recipes.Where(c => c.Time.CompareTo(time) <= 30);
            break;

            case 60:
            recipes = db.Recipes.Where(c => c.Time.CompareTo(time) <= 60);
            break;

            case 61:
            recipes = db.Recipes.Where(c => c.Time.CompareTo(time) >= 61);
            break;

            default:
                recipes = db.Recipes;
                break;
        }


        return View(recipes);
    }

1 个答案:

答案 0 :(得分:0)

case 30:
    recipes = db.Recipes.Where(c => c.Time.CompareTo(time) <= 30);
    break;

我认为您在此处的意思是简单地将c.Time与常量30进行比较。因此,您只需执行.Where(c => c.Time <= 30).Where(c => c.Time <= time),因为time与您要比较的值具有相同的值。

请注意,您不应该始终在db.Recipes处开始查询。通过执行recipes = db.Recipes.Where(…),您将覆盖之前已为recipes设置的任何查询。例如,代码中第一个.Include("Ingredients")的{​​{1}}将被覆盖。

相反,只需继续调用if上的查询方法来继续对其进行修饰:

recipes

对于您的recipes = recipes.Where(c => c.Time <= 30); 语句,由于您在每个常量情况下将时间与switch的值进行比较,因此您不需要将其写入三次。您只需检查timetime30还是60,然后与61进行比较。

总的来说,您的方法可能如下所示:

time

请注意,您应该修改public ViewResult Index(string sortOrder, string searchString, string[] FilteredsearchString, int time) { IQueryable recipes = db.Recipes.Include("Ingredients"); if (!string.IsNullOrEmpty(searchString)) { recipes = recipes.Where(r => r.Ingredients.Contains(searchString)); } if (time == 30 || time == 60 || time == 61) { recipes = recieps.Where(c => c.Time <= time); } return View(recipes); } 逻辑。通过拆分searchString,您传递了然后填充的searchStringFilteredsearchString数组,这对我来说真的没有意义吗?你可能意味着searchString在这里是一个局部变量?