我有两种模式:
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();
但实体框架抱怨它。如何访问实体内部相关记录的数量?任何帮助都感激不尽。感谢。
答案 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计数值。我不知道你的背景,但对你来说可能没必要吗?