2016-01-13 4 views
1

У меня есть две модели:Количество Доступ связанных записей объекта 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(); 

Но Entity Framework жалуется на это. Как я могу получить доступ к счету связанных записей внутри объекта? Любая помощь будет высоко ценится. Благодарю.

+0

Какая ошибка вы получаете? (вы, вероятно, нуждаетесь в 'db.HouseTypes.Include (« HouseModels »). Выберите (....' –

+0

Он говорит, что 'указанный член типа не поддерживается linq ...' @StephenMuecke – Cyval

+2

вы можете попробовать его с помощью icollection вместо ienumerable? –

ответ

1

Использования

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

вместо

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

Надеется, что это помогает.

+0

Спасибо, пожалуйста, объясните почему? – Cyval

+0

@Cyval Лучше проверьте эту ссылку http://stackoverflow.com/вопросы/10113244/почему-потребительная ICollection-и-не-IEnumerable или-listt-на-много-много-один-много-Взаимоотношения –

0

Проще говоря, проблема в том, что EF пытается выполнить оператор .Select() на сервере db, но, конечно, сервер db не знает, как создать новый объект.

Сначала необходимо вернуть счетчики затем создавать свои объекты так, что-то, как это должно работать лучше:

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

в этом примере, когда первый .ToList() выполняется БД нужно только вернуть набор чисел (количество меток HouseModels в каждом типе HouseType), то у нас есть List<int> в локальной памяти, из которого мы можем создать наши объекты со вторым оператором Select.

Как и в стороне ...

Это не было частью вашего первоначального вопроса, но, может быть, вы хотели бы рассмотреть словарь, а не список, чтобы у вас есть какое-то средство идентификации, которые кол HouseModels принадлежал каждый HouseType? в этом случае мы могли бы сделать что-то вроде:

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

, который дал бы словарь заклиненный с Id HouseType со значениями для подсчета HouseModels каждого типа. Я не знаю вашего контекста, хотя, может быть, вам и не нужно?

Смежные вопросы