Вопрос по asp.net, linq-to-sql – LINQ to SQL - Как выбрать определенные столбцы и вернуть строго типизированный список

38

Я пытаюсь использовать LINQ to SQL, чтобы выбрать несколько определенных столбцов из таблицы и вернуть результат в виде строго типизированного списка объектов.

Например:

var result = (from a in DataContext.Persons
                              where a.Age > 18
                              select new Person
                              {
                                  Name = a.Name,
                                  Age = a.Age
                              }
                              ).ToList();

Любая помощь будет принята с благодарностью.

Он хорошо работает, но когда я его запускаю, я получаю сообщение об ошибке. Явная конструкция типа сущностиMyEntity в запросе не допускается.

Что не так с тем, что у вас есть? John Saunders

Ваш Ответ

2   ответа
76

В основном вы делаете это правильно. Тем не менее, вы должны использовать экземплярDataContext для запроса (не очевидно, чтоDataContext это экземпляр или имя типа из вашего запроса):

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new Person { Name = a.Name, Age = a.Age }).ToList();

По-видимому,Person class - это ваш класс сущностей, созданный LINQ to SQL. Вы должны создать свой собственный класс, если вам нужны только некоторые столбцы:

class PersonInformation {
   public string Name {get;set;}
   public int Age {get;set;}
}

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new PersonInformation { Name = a.Name, Age = a.Age }).ToList();

Вы можете свободно менятьvar сList<PersonInformation> здесь ничего не влияя (так как это то, чтоcompiler делает).

В противном случае, если вы работаете локально с запросом, я предлагаю рассмотреть анонимный тип:

var result = (from a in new DataContext().Persons
              where a.Age > 18
              select new { a.Name, a.Age }).ToList();

Обратите внимание, чтоin all of these cases,result являетсяstatically typed (его тип известен во время компиляции). Последний тип являетсяList компилятора генерирует анонимный класс, похожий наPersonInformation класс я написал выше. Начиная с C # 3.0, в языке нет динамической типизации.

UPDATE:

Если вы действительно хотите вернутьList<Person> (что может или не может быть лучше всего сделать), вы можете сделать это:

var result = from a in new DataContext().Persons
             where a.Age > 18
             select new { a.Name, a.Age };

List<Person> list = result.AsEnumerable()
                          .Select(o => new Person {
                                           Name = o.Name, 
                                           Age = o.Age
                          }).ToList();

Вы также можете объединить вышеприведенные утверждения, но я разделил их для ясности.

@unknown (google): обновил ответ, надеюсь, это поможет.
Наверное. Что бы это ни было, вы должны искать его в исходном запросе LINQ. Определенно, дела сделаны послеAsEnumerable() не может работать на сервере, поэтому это не может вызвать каких-либо проблем.
Спасибо за вашу помощь в этом. Я понимаю, что могу создать новый объект, как вы заявили, или я могу оставить его анонимным. Но теперь список, который у меня есть, все еще не относится к типу Персона. Вот где я застрял. Я действительно хочу вернуть список класса сущности LINQ Person. Mike M
Я, конечно, не согласен с тем, что это может быть не лучшим решением ... Но позвольте мне попробовать и посмотреть, что произойдет. Mike M
Ну, может быть, я говорил слишком рано. Для меня это выглядит как во втором операторе, когда он создает новый объект Person, он все еще выполняет вызов базы данных и возвращает все столбцы. Я должен был быть более ясным в отношении моей проблемы, заключающейся в том, что у меня есть несколько столбцов с большим количеством двоичных файлов, которые я не хочу извлекать из базы данных. Mike M
3

Проблема была в том, что одно из свойств было связано с другой таблицей. Я изменил свой запрос LINQ, чтобы он мог получать те же данные из другого метода, не загружая всю таблицу.

Спасибо за вашу помощь!

Похожие вопросы