适合模型的 LINQ 查询
本文关键字:LINQ 查询 模型 | 更新日期: 2023-09-27 18:30:47
我有一个模型版本。 它包含包含文档的一个唯一版本的信息。
在我的视图模型中,我这样设置它:
public virtual ICollection<IPACS_Version> rejectionList { get; set; }
因此,我现在可以拥有版本文档的集合。
下面是 LINQ:
model.rejectionList = (from v in db.IPACS_Version
join d in db.IPACS_Document
on v.documentID equals d.documentID
where v.dateRejected != null && (d.createdBy == currUser || d.requester == currUser)
select v);
这给了我以下错误:
不能将类型"System.Linq.IQueryable"隐式转换为"System.Collections.Generic.ICollection"。存在显式转换(您是否缺少强制转换?
该行可以返回给我 0 到许多"版本"。 所以我认为我没有正确理解的是,为什么这个 LINQ 查询不适合我的版本模型,因为查询返回 0 到许多版本?
LINQ 查询返回 IQueryable<T>
,而您要求它的类型为 ICollection<T>
。这两个界面非常不同,您需要将它们整合到一个性质中。从技术上讲,您需要将IQueryable<T>
具体化为某种内存中的数据序列,这将允许添加和删除其成员(ICollection 接口抽象的性质)
快速解决方案是在查询末尾添加ToList
model.rejectionList = (from v in db.IPACS_Version
join d in db.IPACS_Document
on v.documentID equals d.documentID
where v.dateRejected != null && (d.createdBy == currUser || d.requester == currUser)
select v).ToList();
由于IList实现了ICollection<T>
,这应该可以正常工作。
将属性定义为 IEnumerable<T>
public virtual IEnumerable<IPACS_Version> rejectionList { get; set; }
如果无法将视图模型更改为使用 IEnumerable<T>
而不是 ICollection<T>
,则解决问题的最简单方法是对最终查询调用 ToList
。 List<T>
实现ICollection<T>
.