Сначала код Entity Framework - проблемы проекции

У меня примерно так:

var model = forumsDb.Categories
    .Select(c => new {c, c.Threads.Count})
    .ToList()

Объект My Category выглядит так (псевдокод):

public class Category 
{
     public int id {get;set;}
     public ICollection<Thread> Threads { get; set; }

     /***some properties***/
     [NotMapped]
     public int ThreadCount {get;set;}
}

Теперь в моем объекте модели у меня есть два элемента: model.c и model.Count. Как я могу сопоставить model.Count с model.c.ThreadCount?


person ojek    schedule 13.09.2012    source источник
comment
Какой объект модели вы здесь упоминаете?   -  person cuongle    schedule 13.09.2012
comment
? Я не понимаю, тот, который задан в запросе, который я разместил в верхней части своего сообщения? Фактически он отображается в анонимный тип объекта {Category, int}.   -  person ojek    schedule 13.09.2012
comment
Я не вижу, что у вашей модели есть свойство Count   -  person cuongle    schedule 13.09.2012
comment
Да, он автоматически отображает c.Threads.Count в model.Count после того, как я выполняю запрос, как я уже сказал ранее, теперь я хочу отобразить эту модель.Count в model.c.ThreadCount   -  person ojek    schedule 13.09.2012


Ответы (2)


Определите сильный тип:

public class YourModel
{
    public YourModel(Category c, int count)
    {
        C = c;
        Count = count;
        c.Threads.Count = count;
    }

    public Category C { get; set; }
    public int Count { get; set; }
}

var model = forumsDb.Categories
    .Select(c => new YourModel(c, c.Threads.Count))
    .ToList()
person cuongle    schedule 13.09.2012
comment
Вот это кое-что. Но я получаю некоторые ошибки, просто нужно секундочку, чтобы посмотреть на них. :-) - person ojek; 13.09.2012
comment
Что ж, редактирование - это дерево выражений, поэтому его нельзя преобразовать в linq. Но если я удалю этот оператор return, он подчеркивает .Select и говорит, что не знает, IEnumerable или IQueryable, а ввод .Select<IQueryable>(/*code*/) ничего не делает, так что я думаю, что я в значительной степени застрял здесь. : / Но в этом коде что-то есть, все равно спасибо. :) - person ojek; 13.09.2012

Итерируйте и присвойте значение.

foreach(var entry in model)
{
    entry.c.ThreadCount = entry.Count;
}

var categories = model.Select(m => m.c);
person Eranga    schedule 13.09.2012
comment
Да, это возможно, и я подумал об этом, но что, если бы у меня было около 10 тысяч категорий? Этот подход в значительной степени неэффективен, поэтому я ищу другие решения. Типа, я не знаю, сказать фреймворку сущности, чтобы он автоматически отображал его? - person ojek; 13.09.2012
comment
@ojek в этом случае вам придется измерить. Я предполагаю, что стоимость материализации будет намного выше, чем у петли. Лучше листать результаты, чем тянуть 10к записей. - person Eranga; 13.09.2012