Указанный член типа '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]
Что было то было. Большое вам спасибо, что указали на это.
Имя администратора не сортируется, вы случайно не знаете, как я могу отключить опцию сортировки только для администраторов?