ASP.NET MVC получает разные значения из базы данных с помощью LINQ - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь получить идентификатор и имя нескольких объектов из моей базы данных, когда пользователь отправляет форму. Я не хочу повторений, хотя, когда он отображает результаты.

У меня есть форма:

@using (Html.BeginForm("Advancedresults", "Search", FormMethod.Post))
        {
            {
                foreach (var r in ViewBag.res)
                {
                    string hes = r.iname;
                    <div class="col-md-4">
                        @Html.CheckBox("drink", false, new { value = hes })
                        @r.iname
                    </div>
                }
                <input type="submit" />
            }
        }

Это отправляется на мой контроллер поиска с помощью метода HttpPost:

[HttpPost]
    public ActionResult Advancedresults()
    {
        string drinks = Request.Form["drink"];
        List<string> dList = drinks.Split(',').ToList();
        dList = dList.Where(x => x != "false").ToList();
        List<string> r = new List<string>();

        foreach (string st in dList)
        {

            r.AddRange(from a in db.Recipes.AsEnumerable()
                       join b in db.RecipeIngredients on a.ID equals b.recipe_id
                       join i in db.Ingredients on b.ingredient_id equals i.id
                       join u in db.Measures on b.measure_id equals u.id
                       where i.name.Equals(st)
                       select a.name
                      );
        }

        List<string> ra = new List<string>();

        foreach (string ras in r)
        {
            if (!ra.Contains(ras))
            {
                ra.Add(ras);
            };
        }


        ViewBag.Ingredients = ra.ToList();
        return View();
    }

Есть ли лучший способ добавить идентификатор и имя в ViewBag? Я знаю, что я делаю сейчас - не лучшая практика.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете использовать метод Distinct () LINQ, чтобы выбрать уникальные значения из списка. Пример:

List<string> ra = new List<string>(r.Distinct());

Что касается вашего вопроса, если вы можете добавить имя и идентификатор в ViewBag, я предлагаю вам использовать словарь:

Dictionary<int, string> Results = new Dictionary<int, string>();

Учитывая это, вы можете обновить ваш запрос LINQ примерно так:

var results = (from a in db.Recipes.AsEnumerable()
       join b in db.RecipeIngredients on a.ID equals b.recipe_id
       join i in db.Ingredients on b.ingredient_id equals i.id
       join u in db.Measures on b.measure_id equals u.id
       where dList.Contains(i.name).GroupBy(a => a.ID, a=>a.Name).ToDictionary(s=>s.Key, v=>v.First());

ViewBag.Ingredients = results.ToList();
0 голосов
/ 31 октября 2018

Возможно, вы могли бы упростить его, используя Contains и Distinct

var results = (from a in db.Recipes.AsEnumerable()
           join b in db.RecipeIngredients on a.ID equals b.recipe_id
           join i in db.Ingredients on b.ingredient_id equals i.id
           join u in db.Measures on b.measure_id equals u.id
           where dList.Contains(i.name)
           select a.name ).Distinct();

ViewBag.Ingredients = results.ToList();
...