将linq查询转换为icollection

时间:2010-05-30 15:35:17

标签: list icollection

我需要获取查询结果:

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

并准备ICollection以便我可以拥有类似

的内容
 ICollection<SoilSamplingSubJob> subjobs

目前我创建的列表不符合我的需求:

query.ToList();

我该怎么办 - 是query.ToIcollection()?

3 个答案:

答案 0 :(得分:14)

列表是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 :(得分:1)

因为,query实现了IEnumerable,你可以将它传递给你选择的集合的构造函数。 ICollection是一个接口,由多个类(包括List<T>实现,ToList返回)具有不同的性能特征。

答案 2 :(得分:0)

语法稍有不同,你也可以这样做,这可以减少ICollection的内容。当你有一个庞大的表但只想在cshtml页面中加载一些道具时,这种方法非常适合Angular和MVC:

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>