2013-05-17 5 views
0

У меня есть этот запрос, который делает то, что я хочу, чтобы вернуть true, если какой-либо из материалов сопоставим в списке групп материалов.Нужна помощь по несколько сложному запросу LINQ

mgroup.MaterialGroups.Select(x => x.Materials 
            .Any(m => Convert.ToBoolean(m.Comparable))) 
            .Any(x => x.Equals(true)) 

Что я хочу добавить к этому запросу, так это включить этот.

mgroup.Materials.Any(m => Convert.ToBoolean(m.Comparable)); 

Как объединить группу и ее материальные группы в запросе, чтобы я мог выбрать оба их материала? Благодарю.

EDIT - После борьбы с LINQ на некоторое время я сломалась и просто комбинироваться

mgroup.Materials.Any(m => Convert.ToBoolean(m.Comparable) || 
mgroup.MaterialGroups.Select(x => x.Materials 
        .Any(c => Convert.ToBoolean(c.Comparable)))                                 
        .Any(x => x.Equals(true))) 

Он работает, как ожидалось, но это ужасно долго и она встроена в целях Asp.net MVC для делает вещи даже хуже. Если кто-то может упростить это, это будет потрясающе.

PS- Если вы задаетесь вопросом, почему я добавил дополнительный .any (х => x.Equals (истина), в конце концов, это потому, что без него запрос возвращает IEnumerable из BOOLS вместо BOOL.

ответ

1
IEnumerable<Material> allMaterials = 
         mgroup.Materials.Concat(
         mgroup.MaterialGroups.SelectMany(group => group.Materials)); 
bool result = allMaterials.Any(m => Convert.ToBoolean(m.Comparable)); 
+0

Спасибо, но, к сожалению, это возвращает только true, если группа mgroup.MaterialGroup имеет сопоставимый материал, но не возвращает true, если у самой группы есть сопоставимый материал. Второй запрос, который я опубликовал, работает только для последнего, и первый, который я опубликовал только работает для первого. Вот почему я пытаюсь объединить их в одно утверждение, если это возможно. – Smith

+0

@ Смит Хорошо, теперь я понимаю, будет ли новый код работать? –

+0

Да, это действительно работает. Это не тривиальный запрос? Или, может быть, я t не достаточно LINQ. lol На ваш взгляд, что лучше использовать в представлении? Неправильно ли объявлять IEnumerable только для использования в качестве условия? – Smith

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