在我以前的工作中,EF将查询保持为IQueryable
,直到我使用了一些具体化的方法,例如ToList()
或FirstOrDefault()
,我就可以创建大而灵活的快速查询。但是在我的新工作中,我注意到,IQueryable
方法中的序列具有ICollection
类型,当然,它们还有IEnumerable
种方法(不是IQueriable
)。我无法理解错误以及如何改变它。我还没有在谷歌找到解决方案。 EF的版本与我之前的工作(6.1.3)相同。
例如,我有2个实体类和我自己的类:
public class Client // Entity
{
public int ID { get; set; }
public string FullName { get; set; }
public string Address { get; set; }
...
public virtual ICollection<Parcel> ParcelsSender { get; set; }
public virtual ICollection<Parcel> ParcelsReceiver { get; set; }
}
public class Parcel // Entity
{
public int ID { get; set; }
public string ParcelNumber { get; set; }
...
public int ClientSenderID { get; set; }
public int ClientReceiverID { get; set; }
public virtual Client ClientSender { get; set; }
public virtual Client ClientReceiver { get; set; }
}
public class ClientCustom // My class
{
public int ID { get; set; }
public string FullName { get; set; }
public bool IsInexperienced { get; set; }
}
我创建了这个EF查询:
var clients = context.Clients
.OrderBy(x => x.FullName)
.Select(x => new ClientCustom()
{
ID = x.ID,
FullName = x.FullName,
IsInexperienced = x.ParcelsSender.Select(y => y.ID).FirstOrDefault() == 0
&& x.ParcelsReceiver.Select(y => y.ID).FirstOrDefault() == 0
})
.ToList();
在这种情况下,问题是查询中的x.ParcelsSender
和x.ParcelsReceiver
是ICollection<Parcel>
类型;反过来,x.ParcelsSender.Select()
和x.ParcelsReceiver.Select()
方法会返回IEnumerable<Parcel>
而不是IQueriable<Parcel>
。据我所知,这意味着,查询变得非常缓慢,需要大量数据。