实体框架在执行之前在IQueryable方法中实现集合

时间:2017-06-19 10:11:48

标签: c# entity-framework-6 ienumerable

在我以前的工作中,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.ParcelsSenderx.ParcelsReceiverICollection<Parcel>类型;反过来,x.ParcelsSender.Select()x.ParcelsReceiver.Select()方法会返回IEnumerable<Parcel>而不是IQueriable<Parcel>。据我所知,这意味着,查询变得非常缓慢,需要大量数据。

0 个答案:

没有答案