实体实体框架的相关记录的访问计数

时间:2016-01-13 06:06:34

标签: c# asp.net-mvc entity-framework linq

我有两种模式:

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();

但实体框架抱怨它。如何访问实体内部相关记录的数量?任何帮助都感激不尽。感谢。

2 个答案:

答案 0 :(得分:1)

使用

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

而不是

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

希望这有帮助。

答案 1 :(得分:0)

简单来说,问题是EF正在尝试在数据库服务器上执行.Select()语句,但当然,数据库服务器不知道如何创建新对象。

首先需要带回计数然后创建对象,这样这样的事情应该更好:

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

在这个例子中,当执行第一个.ToList()时,db只需返回一组数字(每个HouseType中HouseModel的计数)然后我们在本地内存中有一个List<int>,我们可以从中使用第二个Select语句创建我们的对象。

暂且不说......

这不是您原始问题的一部分,但也许您想要考虑字典而不是列表,这样您就可以通过某种方法识别哪些HouseModel属于每个HouseType?在这种情况下,我们可以做类似的事情:

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

这将给出一个用HouseType Id键入的字典,其中包含每种类型的HouseModel计数值。我不知道你的背景,但对你来说可能没必要吗?