Malikdanish Ответов: 1

Как группировать строки на основе условия с помощью LINQ в MVC


Привет, у меня есть веб-приложение в mvc , в котором у меня есть учитель и курсы , а также таблица teacherVsCourses , в таблице teachervscourses я сохраняю назначенные курсы для каждого учителя , прямо сейчас у меня есть учитель, для которого я назначил ему пять курсов, и в БД у меня есть пять строк, я хочу, чтобы это была одна строка с именем учителя и пять курсов с разделенным запятыми списком.
<pre> public ActionResult Index(string sortOrder, string currentFilter, string SearchString, int? page)
        {
       

            ViewBag.Course_Id = _ITeacherCoruses.PopulateCourses();
            ViewBag.Teacher_Id = _ITeacherCoruses.PopulateTeachers();
            ViewBag.Semester_Id = _ITeacherCoruses.PopulateSemsters();
            
            ViewBag.CurrentSort = sortOrder;
            ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
            ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
            if (SearchString != null)
            {
                page = 1;
            }
            else
            {
                SearchString = currentFilter;
            }

            ViewBag.CurrentFilter = SearchString;


            var dept = from s in db.Teacher_courses
                       select s;


       
           
         
            dept =dept.Include(t => t.course).Include(t => t.regs).Include(t => t.semesterName).OrderBy(t => t.Teacher_Id);
            if (!String.IsNullOrEmpty(SearchString))
            {
                dept = dept.Where(s => s.course.Course_Name.Contains(SearchString));
                //   || s.FirstMidName.Contains(searchString));
            }
            switch (sortOrder)
            {
                case "name_desc":
                    dept = dept.OrderByDescending(s => s.course.Course_Name);
                    break;
                case "Date":
                    dept = dept.OrderBy(s => s.Course_Assignment_date);
                    break;
                case "date_desc":
                    dept = dept.OrderByDescending(s => s.Course_Assignment_date);
                    break;
                default:
                    dept = dept.OrderBy(s => s.course.Course_Name);
                    break;
            }
            int pageSize = 5;
            int pageNumber = (page ?? 1);


            //  var teacher_courses = db.Teacher_courses.Include(t => t.course).Include(t => t.regs).Include(t => t.semesterName).OrderBy(t=>t.Teacher_Id);
            dept = dept.Include(t => t.course).Include(t => t.regs).Include(t => t.semesterName).OrderBy(t => t.Teacher_Id);
            //return View(groupedUsers);
             return View(productsArray.ToPagedList(pageNumber, pageSize));
           // return View(teacher_courses.ToList());
        }


Что я уже пробовал:

Я сгруппировал запись , но не знаю, как использовать ее на просмотре, снизу пользователь означает учителя, а хобби-курсы
<pre> Teacher_courses[] productsArray = dept.ToArray();
            var groupedUsers = from u in productsArray
                               group u by u.regs.FirstName into g
                               select new
                               {
                                   Name = g.First<Teacher_courses>().Teacher_Id,
                                   Hobby = g.Select(u => u.Course_Id)
                               };

           
            foreach (var user in groupedUsers)
            {
                Console.WriteLine("Teacher_ID: {0}", user.Name);
                foreach (var hobby in user.Hobby)
                {
                    Console.WriteLine("Course_ID: {0}", hobby);
                }
                
            }

1 Ответов

Рейтинг:
2

Christian Graus

Это вернет сгруппированные данные. Как вы его используете, зависит только от вас. Нет никакого правила, которое вы должны использовать LINQ, вы можете писать представления или сохраненные процессы и вызывать их, если хотите


Malikdanish

ниже приведен мой взгляд можете ли вы обновить его в соответствии с моими возвращенными данными
@*@model IEnumerable<cms_monitoring.models.teacher_courses&ГТ;*@
@использование списка страниц;
@использование PagedList.Mvc;
@использование CMS_Monitoring.Прислуга;
@model PagedList.IPagedList<cms_monitoring.models.teacher_courses&ГТ;
@{
Видовой мешок.Title = "Индекс";
Layout = "~/Views/Shared/_Layout2.cshtml";
}

Индекс





setTimeout(функция () {
$('#successMessage').fadeOut('slow');
}, 12000); // <-- время i


@формат HTML.Actionlink панели("создать", "создать", "департаменты", новые { @класс = "БТН БТН-инфо" })


@if (TempData["UpdatedMessage"] != null)
{
@TempData["UpdatedMessage"]
}

@формат HTML.ActionLink("Создать Новый", "Создать")

@использование (в формате HTML.Бигинформ())
{




Поиск по названию отдела: @Html.TextBox("SearchString")



if (TempData["DeleteDepartment"] != null)
{
@TempData["DeleteDepartment"]
}

@foreach (элемент var в модели)
{


}

@Html.DisplayNameFor(model => model[0].курс.Course_Name)
@Html.DisplayNameFor(model => model[0].regs.имя)
@Html.DisplayNameFor(model => model[0].semesterName.Semester_Title)
@Html.DisplayNameFor(model => model[0].is_on_Substitute)
@Html.DisplayNameFor(model => model[0].Активный)
@Html.DisplayNameFor(model => model[0].Course_Assignment_date)
@Html.DisplayNameFor(model => model[0].Date_Modified)
@Html.DisplayNameFor(model => model[0].Added_By)





@Html.DisplayFor(modelItem => item.course.Course_Name)
@Html.DisplayFor(modelItem => item.regs.имя)

@Html.DisplayFor(modelItem => item.semesterName.Semester_Title)
@Html.DisplayFor(modelItem => item.is_on_Substitute)
@Html.DisplayFor(modelItem => item.Активный)
@Html.DisplayFor(modelItem => item.Course_Assignment_date)
@Html.DisplayFor(modelItem => item.Date_Modified)
@Html.DisplayFor(modelItem => item.Added_By)
@формат HTML.Actionlink панели("редактирование", "редактирование", новый { ИД = товар.Идентификатор }) |
@формат HTML.Actionlink панели("подробности", "Подробности", новый { ИД = товар.Идентификатор }) |
@формат HTML.Actionlink панели("удалить", "удалить", новый { ИД = товар.Айди })

}
Страница @(Модель.PageCount < модель.Номер страницы ? 0 : модель.Значение pagenumber) на @модель.PageCount

@формат HTML.PagedListPager(модель, страница => Url.Action("индекс",
новые страницы, порядок сортировки = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

Christian Graus

Это не имеет никакого смысла вообще. Это не поможет. С какой стати вы его используете ASP.NET-что?

Ваша точка зрения, если она у вас есть, - это SQL. Это файл ASPX.

Malikdanish

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

Christian Graus

Итак, сгруппируйте записи в SQL, я сказал это для начала

Malikdanish

Я просто хочу спросить, как мне отправить эти данные для просмотра ?

Malikdanish

Привет я изменил свой код представления чтобы сгруппировать там данные
@foreach (элемент var в модели)
{
@foreach(var group in Model.Метод groupBy(модель=&ГТ; модель.регс.имя))
{
@HTML-код.Кодирование(группа.Ключ)
@foreach(var tm в группе)
{
@HTML-код.Кодирование(ТМ.конечно.Course_Name)}

}
@*@Html.DisplayFor(modelItem => item.course.Course_Name)*@
но проверьте , что это неправильно,я не знаю, почему, он показывает пять курсов для ALAM, но в БД есть 4 строки для этого пользователя, во-вторых, группировка все еще повторяет количество строк, которое неправильно
https://imgur.com/33BJUjA

Christian Graus

Опять же, напишите представление SQL, которое группирует ваши данные так, как вы хотите, и вызовите его....

Malikdanish

По sql я сделал это с помощью функции STuff я хочу сделать это с entity framework только с помощью Linq , независимо от того, чтобы сделать это из контроллера или из представления я не хочу вызывать хранимую процедуру я использую Entity framework с помощью linq

Christian Graus

Хорошо, хорошо, если вы не хотите использовать доступные вам инструменты, то я думаю, что играйте с вашим оператором LINQ, пока он не вернет данные, которые вы ожидаете. Если вам нужна помощь, опубликуйте данные, свой код и то, что вы считаете неправильным в результате

Malikdanish

Вот мой код контроллера индекса :
индекс общественного ActionResult(строка сортировки, строки currentFilter, строки SearchString, инт? страница)
{


Видовой мешок.Идентификатор_курса = _ITeacherCoruses.PopulateCourses();
Видовой мешок.Teacher_Id = _ITeacherCoruses.PopulateTeachers();
Видовой мешок.Semester_Id = _ITeacherCoruses.PopulateSemsters();
// ViewBag.Teacher_Id = новый список выбора(db.Registration, "User_Id", "FirstName");
Видовой мешок.CurrentSort = сортировщик;
Видовой мешок.NameSortParm = Строка.IsNullOrEmpty(сортировщик) ? "name_desc" : "";
Видовой мешок.DateSortParm = sortOrder == "дата" ? "date_desc" : "дата";
if (SearchString != null)
{
Страница = 1;
}
еще
{
SearchString = currentFilter;
}

Видовой мешок.CurrentFilter = Строка Поиска;


var dept = from s в БД.Teacher_courses
выберите s;



отдел =отдел.Включают в себя(Т =&ГТ; Т.конечно).Включают в себя(Т =&ГТ; Т.рэгс).Include(t => t.semesterName).OrderBy(t => t.Teacher_Id);
если (!строка.IsNullOrEmpty(Строка Поиска))
{
отдел = отдел.Где(S =&ГТ; с. конечно.Course_Name.Содержит(Строка Поиска));
// || С. FirstMidName.Содержит(строка поиска));
}
переключатель (сортировщик)
{
дело "name_desc":
отдел = отдел.OrderByDescending(ы =&ГТ; с. конечно.Course_Name);
перерыв;
дело "дата":
отдел = отдел.OrderBy(s => s.Course_Assignment_date);
перерыв;
кейс "date_desc":
отдел = отдел.OrderByDescending(s => s.Course_Assignment_date);
перерыв;
по умолчанию:
отдел = отдел.Заказатьпо(ы =&ГТ; с. конечно.Course_Name);
перерыв;
}
int pageSize = 5;
int pageNumber = (Страница ?? 1);


// var teacher_courses = db.Teacher_courses.Включают в себя(Т =&ГТ; Т.конечно).Включают в себя(Т =&ГТ; Т.рэгс).Include(t => t.semesterName).OrderBy(t=>t.Teacher_Id);
отдел = отдел.Включают в себя(Т =&ГТ; Т.конечно).Включают в себя(Т =&ГТ; Т.рэгс).Include(t => t.semesterName).OrderBy(t => t.Teacher_Id);
//return View(groupedUsers);
return View(productsArray.ToPagedList(значение pagenumber, размер страницы));
// вид возврата(teacher_courses.Список());
}
----
Вот мой индексный просмотр :
@*@model IEnumerable<cms_monitoring.models.teacher_courses&ГТ;*@
@использование списка страниц;
@использование PagedList.Mvc;
@использование CMS_Monitoring.Прислуга;
@model PagedList.IPagedList<cms_monitoring.models.teacher_courses&ГТ;
@{
Видовой мешок.Title = "Индекс";
Layout = "~/Views/Shared/_Layout2.cshtml";
}

Индекс





setTimeout(функция () {
$('#successMessage').fadeOut('slow');
}, 12000); // <-- время i


@формат HTML.Actionlink панели("создать", "создать", "департаменты", новые { @класс = "БТН БТН-инфо" })


@if (TempData["UpdatedMessage"] != null)
{
@TempData["UpdatedMessage"]
}

@формат HTML.ActionLink("Создать Новый", "Создать")

@использование (в формате HTML.Бигинформ())
{




Поиск по названию отдела: @Html.TextBox("SearchString")



if (TempData["DeleteDepartment"] != null)
{
@TempData["DeleteDepartment"]
}

@foreach (элемент var в модели)
{
}

@Html.DisplayNameFor(model => model[0].курс.Course_Name)
@Html.DisplayNameFor(model => model[0].regs.имя)
@Html.DisplayNameFor(model => model[0].semesterName.Semester_Title)
@HTML-код.Д

Malikdanish

вот результат, который я получаю
https://imgur.com/5O4J7vc
вот результат, который я хочу получить, я хочу, чтобы все курсы одного учителя были в одном ряду

Christian Graus

https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.groupby?view=netframework-4.8