2011-04-01 2 views
0

Хорошо, я пытаюсь найти все подкатегории из моей базы данных (используя формирование результата запроса), которые относятся к той категории, которую я поставляю. Мой класс SubCategory включает в себя список <> категорий.LINQ, как указать, чтобы включать элементы из списка <>

Проблема заключается в том, что в выражении linq g относится к подкатегории (которая в конце содержит категории <>). Поэтому приведенное ниже утверждение не допускается.

Как изменить оператор Linq, чтобы сгенерировать правильный SQL-запрос, чтобы включить все подкатегории, содержащие соответствующую категорию.

public class SubCategory 

    { 
     public int SubCategoryId { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public List<Article> Articles { get; set; } 
     public List<Category> Categories { get; set; } 
    } 

//incorrect code below: 
var SubCategories = storeDB.SubCategories.Include("Categories").Single(g => g.Name == category); 

ответ

1

Мне кажется, это немного запутанно, что каждая подкатегория может принадлежать более чем одной категории - есть ли у вас эти отношения правильно?

Несмотря на это, я думаю, что его, вероятно, более читаемым, если вы измените выбор для работы на Категории первой - то есть что-то вроде:

var subCatQuery = from cat in storeDB.Categories 
        where cat.Name == category 
        select cat.SubCategories; 

, которые вы можете выполнить, чтобы получить IEnumerable <>:

var subCategories = subCatQuery.ToList(); 

Я нахожу это более читабельным/понятным.


(я также найти синтаксис запроса легче прочитать здесь, чем беглый стиль)

+0

Действительно, подкатегория может принадлежать более Категории (например: куртка с кошкой для мужчин и женщин, блузка принадлежит только женщинам кошки). В любом случае, ваше изменение приводит к следующей ошибке: {«Элемент модели, переданный в словарь, имеет тип« System.Data.Entity.Infrastructure.DbQuery'1 [System.Collections.Generic.List'1 [Project1.Models.SubCategory ]] ', но для этого словаря требуется элемент модели типа' System.Collections.Generic.IEnumerable'1 [Project1.Models.SubCategory] '. "} –

+0

Это похоже на то, что вы еще не выполнили запрос - I Добавлю строку ... – Stuart

1

Это работало для меня (может быть, слишком просто):

var Category = storeDB.Categories.Include("SubCategories").Single(c => c.Name == category); 
return Category.SubCategories; 
0

мой предпочтительный ответ будет используйте соединение linq. если есть не 2 набора данных, вы можете использовать операции linq .join и .groupjoin против оператора from. это будет мой подход.

Dictionary<MainQuery, List<subQuery>> Query = 
    dbStore.List<MainQuery>.include("IncludeAllObjects") 
    .groupjoin(db.List<SubTable>.Include("moreSubQueryTables"), 
    mainQueryA=>mainQueryA.PropToJoinOn, 
    subQueryB => sunQueryB.PropToJoinOn, 
    ((main, sub)=> new {main, sub}) 
    .ToDictionary(x=>x.main, x=>x.sub.ToList()); 
Смежные вопросы