繁体   English   中英

实体Entity Framework相关记录的访问计数

[英]Access count of related records of an entity Entity Framework

我有两个模型:

public class HouseType
 {
    public int Id { get; set; }
    public string TypeName { get; set; }

    public virtual IEnumerable<HouseModel> HouseModels { get; set; }
 }

public class HouseModel
{
    public int Id { get; set; }
    public string ModelName { get; set; }

    [DisplayFormat(DataFormatString = "{0:n2}")]
    public double StandardPrice { get; set; }

    [ForeignKey("HouseType")]
    public int HouseTypeID { get; set; }

    public virtual HouseType HouseType { get; set; }

    public virtual IEnumerable<HouseUnit> HouseUnits { get; set; }
}

我返回的是JSON结果,因此按预期,我无法在视图中进行操作,因为显示是由我制作的javascript文件处理的。

我正在尝试检索HouseModel包含的HouseType 我努力了:

db.HouseTypes.Select(h => new
 {
     HouseCount = h.HouseModels.Count()
  }).ToList();

但是实体框架对此有所抱怨。 如何访问实体中相关记录的数量? 任何帮助都感激不尽。 谢谢。

采用

public virtual ICollection<HouseUnit> HouseUnits { get; set; }

代替

public virtual IEnumerable<HouseUnit> HouseUnits { get; set; }

希望这可以帮助。

简单地说,麻烦在于EF试图在数据库服务器上执行.Select()语句,但是,当然,数据库服务器不知道如何创建新对象。

您首先需要带回计数, 然后创建您的对象,这样类似的事情应该可以更好地工作:

var listOfCounts = db.HouseTypes
    .Select(h => h.HouseModels.Count())
    .ToList()   
    .Select(c => new
    {
         HouseCount = c
    })
    .ToList();

在此示例中,当执行第一个.ToList() ,数据库仅需要返回一组数字(每个HouseType中的HouseModels的计数),那么我们在本地内存中就有一个List<int> ,我们可以使用第二条Select语句。

作为旁白...

这不是您最初的问题的一部分,但也许您想考虑使用词典而不是列表,因此您可以通过某种方式来确定每种HouseType属于哪些HouseModels? 在这种情况下,我们可以执行以下操作:

Dictionary<int,string> houseModelCounts = db.HouseTypes
    .ToDictionary(h => h.Id, h => h.HouseModels.Count());

这将给出一个以HouseType Id为键的字典,其中包含每种类型中HouseModels的计数值。 我不知道您的情况,所以也许对您来说不必要?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM