Как указать, какие столбцы можно вернуть из запроса linq в sql
Я пытаюсь вернуть только несколько столбцов из запроса linq to sql, но если я это сделаю, он выдаст исключение:
Явное построение типа объекта "InVision.Data.Employee" в запросе не допускается
Вот код:
return db.Employees.Select(e => new Employee()
{ EmployeeID = e.EmployeeID, FirstName = e.FirstName,
LastName = e.LastName }).ToList();
Если я верну все, тогда он выдаст исключения для циклических ссылок, потому что он должен быть сериализован для использования в javascript, поэтому мне действительно нужно ограничить столбцы... Спасибо за любые советы, которые вы можете дать мне, чтобы решить эту проблему.
3 ответа
В основном, если вы просто хотите столбцы, выберите их. Если вы хотите, чтобы объект сотрудника, выберите его. Здесь не так много среднего. Я рекомендую не создавать новый класс только для этого. Тьфу!
Сделай это:
return db.Employees
.Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
.ToList();
Потому что мне пришлось бороться с Linq2Sql и сериализацией, прежде чем я рекомендую использовать объект View для обработки этого сценария, а не сущность Linq2Sql. Это гораздо более простое решение:
return db.Employees
.Select( e => new EmployeeView()
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName
}).ToList();
Другой вариант - перетащить новую копию таблицы Employee в конструктор DBML, назвать ее чем-то другим, например SimpleEmployee, удалить все связи и удалить все ненужные столбцы.
Джастин,
Объяснение этой ошибки здесь: http://devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx
Одна вещь, которую вы можете сделать, - это создать класс, который выводится из Employee.
public class EmployeeProxy : Employee
{
}
тогда вы можете сделать свой запрос:
return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
С другой стороны, если вам нужно только сериализовать набор результатов в javascript, то вы также можете просто использовать анонимные классы. Это работает также:
return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
Надеюсь это поможет.