преобразование linq-запроса в icollection - PullRequest
8 голосов
/ 30 мая 2010

Мне нужно принять результаты запроса:

 var query = from m in db.SoilSamplingSubJobs where m.order_id == id select m;

и подготовьтесь как ICollection, чтобы я мог получить что-то вроде

 ICollection<SoilSamplingSubJob> subjobs

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

query.ToList();

что мне делать - это query.ToIcollection ()?

Ответы [ 3 ]

14 голосов
/ 30 мая 2010

Список - это ICollection. Вы можете изменить свой код query.ToList () следующим образом.

query.ToList() as ICollection<SoilSamplingSubJob>;

Ваш вопрос звучит так, как будто этот запрос возвращается как результат функции. Если это так, помните, что объекты Linq to SQL подключены по умолчанию, поэтому вам необходимо определить, где контекст вашей базы данных открывается и закрывается. В качестве альтернативы вы можете создать DTO (объекты передачи данных), которые содержат данные, которые вы хотите использовать в остальной части вашей программы. Эти объекты могут вписываться в вашу иерархию объектов любым способом.

Вы также можете создать эти DTO как часть запроса.

var query = from m in db.SoilSamplingSubJobs where m.order_id == id
            select new SubJobDTO {
                OrderNumber = m.order_id
            };
return query.ToList() as ICollection<SubJobDTO>;
1 голос
/ 30 мая 2010

Поскольку запрос реализует IEnumerable, вы можете передать его конструктору коллекции по вашему выбору. ICollection - это интерфейс, реализованный несколькими классами (включая List<T>, который возвращает ToList) с различными характеристиками производительности.

0 голосов
/ 08 августа 2017

С немного другим синтаксисом вы также можете делать что-то подобное, что может сократить количество входов в ICollection. Этот тип подхода отлично подходит для Angular и MVC, когда у вас огромная таблица, но вы хотите загрузить только некоторые реквизиты на страницу cshtml:

ICollection<SoilSamplingSubJob> samples = dbContext.GetQuery().Where(m => m.order_id == id)
.AsEnumerable().Select(s => new
            {
                Id = s.order_id,
                CustomProperty = s.some_thing
            }).ToList() as ICollection<SoilSamplingSubJob>
...