Как указать, какие столбцы могут быть возвращены из запроса linq to sql

StackOverflow https://stackoverflow.com/questions/1015979

Вопрос

Я пытаюсь вернуть только несколько столбцов из запроса linq to sql, но если я это сделаю, это вызовет исключение:

Явное построение объекта типа 'InVision.Data.Employee' в запросе не допускается

Вот код:

return db.Employees.Select(e => new Employee()
       { EmployeeID = e.EmployeeID, FirstName = e.FirstName,
         LastName = e.LastName }).ToList();

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

Это было полезно?

Решение

Как правило, если вам нужны столбцы, выберите их. Если вы хотите сотрудника, выберите его. Здесь не так много среднего. Я рекомендую не создавать новый класс только для этого. Тьфу!

Сделайте это:

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();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top