Truecolors Ответов: 1

Указанный член типа 'fullname' не поддерживается в LINQ to entities


У меня есть jQuery DataTable с серверной обработкой, которая дает мне проблему циклической зависимости.

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

& gt; DataTables warning: table id=datatableServer-Ajax error.

Есть ли способ исправить эту проблему?

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

** Класс отдела**

public class Department
   {
       public int DepartmentID { get; set; }

       [StringLength(50, MinimumLength = 3)]
       public string Name { get; set; }

       [DataType(DataType.Currency)]
       [Column(TypeName = "money")]
       public decimal Budget { get; set; }

       [DataType(DataType.Date)]
       [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
       [Display(Name = "Start Date")]
       public DateTime StartDate { get; set; }

       [Display(Name = "Administrator")]
       public int? InstructorID { get; set; }

       [Timestamp]
       public byte[] RowVersion { get; set; }

       public virtual Instructor Administrator { get; set; }
       public virtual ICollection<Course> Courses { get; set; }
   }


**Инструктор**
public class Instructor : Person
    {
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        [Display(Name = "Hire Date")]
        public DateTime HireDate { get; set; }

        public virtual ICollection<Course> Courses { get; set; }
        public virtual OfficeAssignment OfficeAssignment { get; set; }
    }


**Контроллер**

public ActionResult DataHandler([ModelBinder(typeof(DataTablesBinder))] IDataTablesRequest requestModel)
    {
        //IQueryable<Department> query = departmentService.GetDepartments();

        IQueryable<Department> query;

        using (SchoolContext db = new SchoolContext())
        {
            query = db.Departments;

            var totalCount = query.Count();

            // Apply filters for searching
            if (requestModel.Search.Value != string.Empty)
            {
                var value = requestModel.Search.Value.Trim();
                query = query.Where(p => p.Name.Contains(value) 
                //|| p.Administrator.FullName.Contains(value));                                                                                                  
            }

            var filteredCount = query.Count();

            // Sorting
            var sortedColumns = requestModel.Columns.GetSortedColumns();
            var orderByString = String.Empty;

            foreach (var column in sortedColumns)
            {
                orderByString += orderByString != String.Empty ? "," : "";
                orderByString += (column.Data) +
                  (column.SortDirection ==
                  Column.OrderDirection.Ascendant ? " asc" : " desc");
            }

            query = query.OrderBy(orderByString ==
            string.Empty ? "BarCode asc" : orderByString);

            // Paging
            query = query.Skip(requestModel.Start).Take(requestModel.Length);

            var data = query.Select(a => new
            {
                Name = a.Name,
                Budget = a.Budget,
                StartDate = a.StartDate,
                //Administrator = a.Administrator.FullName
            }).ToList();

            return Json(new DataTablesResponse
            (requestModel.Draw, data, filteredCount, totalCount),
                        JsonRequestBehavior.AllowGet);
        }
    }


**Скрипт**

$(document).ready(function () {

        $('#datatable').dataTable();  //client side datatable

        var departmentsList;
        $(function () {
            departmentsList = {
                dt: null,

                init: function () {
                    //Server-side dataTable
                    dt = $('#datatableServer').DataTable({
                        "serverSide": true,
                        "processing": true,
                        "ajax": {
                            "url":
                            "@Url.Action("DataHandler","Department")"
                        },
                        "columns": [
                            { "data": "Name",
                            "searchable": true },
                            { "data": "Budget",
                            "searchable": true },
                            { "data": "StartDate",
                            "searchable": true }
                            //{ "data": "Administrator",
                            //"searchable": true }
                        ],
                        "lengthMenu": [[10, 25, 50, 100], [10, 25, 50, 100]],
                    });
                }
            }
            // initialize the datatables
            departmentsList.init();
        });
    });

Graeme_Grant

Вы пробовали использовать отладчик и пошагово просматривать свой код, чтобы понять, почему?

Member 13059365

Да, это так. Я провел 2 дня с этим сообщением об ошибке. И пришли к выводу, что это потому, что мой класс отдела имеет свойство навигации для класса администратора(инструктора). Я должен получить полное имя администратора в моей таблице данных. Когда я включаю это поле, я получаю "Datatable warning: -Ajax error", когда я выполняю поиск или сортировку чего-либо в dataTable.
Но когда я не включаю поле имени администратора, оно работает нормально.

Graeme_Grant

Я не знаком с jQuery DataTable, однако после того, как погуглил вокруг, у меня появилось ощущение, что ответ, возвращающийся с сервера, не является тем, что ожидает вызов ajax - нет данных, слишком много данных, неправильный формат и т. д... Если вы используете инструменты Chrome dev и проверяете разговор с сервером на наличие хорошего вызова по сравнению с плохим вызовом, который вы испытываете, вы должны быть в состоянии определить первопричину вашей проблемы.

Ehsan Sajjad

вам не нужно включать его непосредственно в select, вместо этого проецируйте его конкретные свойства, как вы это делали, но я вижу, что он закомментирован. :

Administrator = a.Administrator.FullName

[no name]

Я включил

Administrator = a.Administrator.FullName
для моего
var data
, но я получаю это сообщение об ошибке,

Указанный член типа 'FullName' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, члены сущностей и свойства навигации сущностей.

CHill60

Где ваш инструкторский класс?

[no name]

Я добавил класс инструктора в свой вопросительный пост.

CHill60

Я предполагаю, что у вашего класса Person есть поле под названием FullName?

[no name]

Да, это так.

[Display(Name = "Full Name")]
        public string FullName
        {
            get
            {
                return LastName + ", " + FirstMidName;
            }
        }

CHill60

Хорошо-вы пробовали поставить точку останова на линии, которая вызывает ошибку, и исследовать содержимое объекта в этой точке? Возможно, вам придется использовать OfType, чтобы добраться до базового класса

SrikantSahu

FullName не является членом сущности (т. е. именем столбца для таблицы Person), по этой причине запрос не может быть выполнен. Можете ли вы попробовать только с фамилией. Если это работает, то вы можете использовать <LastName + ", " + FirstMidName>

[no name]

Что было то было. Большое вам спасибо, что указали на это.

Имя администратора не сортируется, вы случайно не знаете, как я могу отключить опцию сортировки только для администраторов?

1 Ответов

Рейтинг:
4

SrikantSahu

FullName не является членом сущности (т. е. именем столбца для таблицы Person), по этой причине запрос не может быть выполнен. Можете ли вы попробовать только с фамилией. Если это работает, то вы можете использовать < LastName + ", " + FirstMidName>.
Для сортировки у нас есть несколько способов ее блокировки. Вы можете использовать

{ "data": "Administrator", "searchable": true , "orderable": false}
Обратиться столбцы.заказываемый[^]