Как указать, какие столбцы можно вернуть из запроса linq в sql - PullRequest
1 голос
/ 19 июня 2009

Я пытаюсь вернуть только несколько столбцов из запроса 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 ]

3 голосов
/ 19 июня 2009

Поскольку мне приходилось бороться с Linq2Sql и сериализацией, прежде чем я порекомендовал бы использовать объект View для обработки этого сценария, а не сущность Linq2Sql. Это гораздо более простое решение:

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

Другой вариант - перетащить новую копию таблицы Employee в конструктор DBML, назвать ее чем-то другим, например SimpleEmployee, удалить все связи и удалить все ненужные столбцы.

1 голос
/ 19 июня 2009

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

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

return db.Employees
   .Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
   .ToList();
0 голосов
/ 19 июня 2009

Justin

Объяснение этой ошибки здесь: 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();

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

...