2015-03-23 2 views
-1

У меня есть следующие Entity Framework методыСоберите два Linq запросов в одном запросе

maList = (from p in db.full 
        where (p.mc_object.Contains(str)) 
        group p by p.mc_object into g 
        orderby g.Count() descending 
        select new StringIntType 
        { 
         str = g.Key, 
         nbr = g.Count(), 
         par="object" 
        }).ToList(); 

maList = (from p in db.full 
        where (p.mc_owner.Contains(str)) 
        group p by p.mc_owner into g 
        orderby g.Count() descending 
        select new StringIntType 
        { 
         str = g.Key, 
         nbr = g.Count(), 
         par="owner" 
        }).ToList(); 

Я хотел бы сделать их в одном запросе.

+1

Вы можете удалить один из запросов, то вы будете иметь только один левый ... работу. Серьезно, мы хотели угадать, как вы хотели бы объединить эти запросы? Какие данные вы ожидаете в конце? – spender

ответ

3

Вы можете использовать Concat:

var objects = from p in db.full 
       where (p.mc_object.Contains(str)) 
       group p by p.mc_object into g 
       orderby g.Count() descending 
       select new StringIntType 
       { 
        str = g.Key, 
        nbr = g.Count(), 
        par="object" 
       }; 

var owner = from p in db.full 
      where (p.mc_owner.Contains(str)) 
      group p by p.mc_owner into g 
      orderby g.Count() descending 
      select new StringIntType 
      { 
       str = g.Key, 
       nbr = g.Count(), 
       par="owner" 
      }; 

maList = objects.Concat(owner).ToList(); 

Это не выглядит как один запрос, но из-за отложенного выполнения LinQ только один запрос отправляется в базу данных на ToList().

+0

Это хорошо работает, но как это сделать, если у меня есть 4 вопроса, я буду использовать .contact (xxxx) .concat (yyyy) .concat (zzz)? – Redadublex

+0

@Redadublex: так как это даже разные таблицы, да. Но это не лучшая модель данных. Если таблицы настолько похожи, вы должны использовать одну таблицу с другим столбцом «Тип» или так. –

+0

Да, я согласен, я борюсь с другим запросом в sql-сервере, может быть, если я его решаю, я попытаюсь преобразовать его в linq – Redadublex

0

Вы можете использовать метод Union

maList = (from p in db.full 
       where (p.mc_object.Contains(str)) 
       group p by p.mc_object into g 
       orderby g.Count() descending 
       select new StringIntType 
       { 
        str = g.Key, 
        nbr = g.Count(), 
        par="object" 
       }) 
       .Union(from p in db.full 
       where (p.mc_owner.Contains(str)) 
       group p by p.mc_owner into g 
       orderby g.Count() descending 
       select new StringIntType 
       { 
        str = g.Key, 
        nbr = g.Count(), 
        par="owner" 
       }).ToList(); 
+0

'Union' пытается удалить дубликаты, которые здесь не нужны. Оба они отличаются друг от друга, потому что у него есть «par =» object »и другой« par = »owner». 'Concat' подобен' UNION ALL' в sql и фактически он переводится на это. –