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

C# 实体框架相关记录的访问计数,c#,asp.net-mvc,entity-framework,linq,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; } } 但实体框架对此表示不满。如何访问实体内相关记录的计数?任何帮助都将不胜感激。谢谢。简单地说,问题是EF试图在db服务器上执行.

我有两种型号:

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

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

但实体框架对此表示不满。如何访问实体内相关记录的计数?任何帮助都将不胜感激。谢谢。

简单地说,问题是EF试图在db服务器上执行
.Select()
语句,但当然,db服务器不知道如何创建新对象

您首先需要恢复计数,然后创建对象,这样做会更好:

在本例中,当执行第一个
.ToList()
时,db只需要返回一组数字(每个房屋类型中房屋模型的计数),然后我们在本地内存中有一个
列表
,我们可以使用第二个Select语句从中创建对象

作为旁白

这不是你原来的问题的一部分,但也许你想考虑一个字典而不是一个列表,所以你有一些方法来识别哪些户籍属于每个房型?在这种情况下,我们可以这样做:

字典houseModelCounts=db.HouseTypes
.ToDictionary(h=>h.Id,h=>h.HouseModels.Count());
这将提供一个用HouseType Id键入的字典,其中包含每个类型中的HouseModels计数的值。我不知道你的背景,所以可能对你来说没有必要?

使用

public virtual ICollection<HouseUnit> HouseUnits { get; set; }
公共虚拟ICollection HouseUnits{get;set;} 而不是

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

希望这有帮助。

您遇到了什么错误?(您可能需要
db.HouseTypes.Include(“HouseModels”)。选择(..
它说
指定类型成员不受支持linq…
@Stephenmueckek你能用icollection而不是ienumerable来尝试吗?@FrebinFrancis把它作为一个答案发布出来。效果很好。Than ks.@Cyval把它作为一个答案发布。谢谢!你能解释一下为什么吗?@Cyval最好检查一下这个链接
var listOfCounts = db.HouseTypes
    .Select(h => h.HouseModels.Count())
    .ToList()   
    .Select(c => new
    {
         HouseCount = c
    })
    .ToList();
public virtual ICollection<HouseUnit> HouseUnits { get; set; }
public virtual IEnumerable<HouseUnit> HouseUnits { get; set; }