Как указать, какие столбцы можно вернуть из запроса 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();

Надеюсь это поможет.

Другие вопросы по тегам