适合模型的 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 查询

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> ,则解决问题的最简单方法是对最终查询调用 ToListList<T>实现ICollection<T> .