Почему EF не может сортировать элементы по порядку другой коллекции и как обойти это? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытался отсортировать запрос LINQ, используя список строк.Я спрашиваю студенческие условия и в том числе TermCourses.В коде выдается следующая ошибка:

System.NotSupportedException: LINQ to Entities не распознает метод метода Int32 IndexOf (System.String), и этот метод нельзя преобразовать в выражение хранилища.. '

Я сделал такую ​​сортировку, используя DataTables, где у меня есть только строки, но не в EF, и дерево объектов.

Как мне обойти эту проблему?

Вот мой код:

private static readonly List<string> SortingOrder =
   new List<string>()
   {
        "Fall",
        "Spring",
        "Summer"
   };

using (var context = new EUContext())
{
    var tmp = context.Terms.Include(x=>x.TermCourses)
        .OrderBy(x => x.AcademicYear)
        .ThenBy(x => SortingOrder.IndexOf(x.TermRegistered))
        .Where(x => x.StudentID == studentId && x.DepartmentID == departmentId);
    return tmp.ToList();
}

1 Ответ

0 голосов
/ 26 ноября 2018

Вы пытаетесь отсортировать базу данных способом, который доступен только в вашем коде / оперативной памяти.Вам необходимо перенести управление сортировкой обратно на локальный компьютер:

private static readonly List<string> SortingOrder =
   new List<string>()
   {
        { "Fall" },
        { "Spring" },
        { "Summer" }
   };

using (var context = new EUContext())
{
    // this part will query the database
    var tmp = context.Terms
                     .Include(x=>x.TermCourses)
                     .Where(x => x.StudentID == studentId && x.DepartmentID == departmentId)

                     // this will transfer controll to your local machine
                     .AsEnumerable() 

                     // sort on your local machine by the data you have in your RAM
                     .OrderBy(x => x.AcademicYear)
                     .ThenBy(x => SortingOrder.IndexOf(x.TermRegistered));

    return tmp.ToList();
}
...