ef cf linq populate ignored property

no1*_*oss 2 linq entity-framework ef-code-first c#-4.0

我确定之前已经问过这个问题,但我找不到一个好的方法来搜索它.

我有一个类似以下的课程

public class Vendor
{
    public int VendorId { get; set; }
    public string Name { get; set; }
    public int ProductCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个配置类设置

public class VendorConfiguration : EntityTypeConfiguration<Vendor>
{
    public VendorConfiguration()
    {
        Property(p => p.Name).IsRequired().HasMaxLength(128);
        Ignore(v => v.ProductCount);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我用来抓住供应商的查询.

    public Vendor[] GetVendors()
    {
        using (var db = new UbidContext())
        {
            var query = (from vendor in db.Vendors
                                        select vendor);

            return query.ToArray();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我怎么能用一个看起来类似的子查询填充ProductCount

ProductCount = (from vend in db.VendorProducts
 where vend.VendorId == id
 select vend).Count()
Run Code Online (Sandbox Code Playgroud)

有没有办法可以将它添加到主查询中,所以我只对数据库进行1次调用?

谢谢,安德鲁

Sla*_*uma 6

我会这样试试:

public Vendor[] GetVendors()
{
    using (var db = new UbidContext())
    {
        var query = from vendor in db.Vendors
                    join vp in db.VendorProducts
                        on vendor.VendorId equals vp.VendorId
                    into vendorProducts
                    select new
                    {
                        Vendor = vendor,
                        ProductCount = vendorProducts.Count()
                    };

        foreach (var item in query)
            item.Vendor.ProductCount = item.ProductCount;

        return query.Select(a => a.Vendor).ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是您必须投影到非实体类型(上例中的匿名),然后在返回之前将投影ProductCount值复制到Vendor项目中.