Использование объединения с System.Linq.IQueryable

#c# #linq-to-sql #union #iqueryable

#c# #linq-to-sql #объединение #iqueryable

Вопрос:

Я пытаюсь использовать объединение в своем коде:

 var qryQuestions =
    (from q in db.table1
    where q.ID == ID
       amp;amp; q.categoryID == categoryID
    orderby q.questionOrder ascending
    select q) .Union
        (from qp in db.table2
        where qp.ID == ID
           amp;amp; qp.categoryID == categoryID
        orderby qp.questionOrder ascending
        select qp);
  

и я получаю сообщение об ошибке:

Ошибка 15 ‘System.Linq.IOrderedQueryable<table1>’ не содержит определения для ‘объединения’ и лучший метод расширения перегружает ‘System.Linq.Количество параллелей.Объединение<TSource>(System.Linq.Параллельный запрос<TSource>, System.Коллекции.Общий.IEnumerable<TSource>)’ имеет некоторые недопустимые аргументы

и

Ошибка 30 Аргумент экземпляра: не удается преобразовать из ‘System.Linq.IOrderedQueryable<table1>’ to ‘System.Linq.ParallelQuery<table2>’

Ответ №1:

Это потому, что вы выбираете два разных набора данных, и Linq не может понять, что вы пытаетесь сделать.

вместо ….выберите q и …. выберите qp

 var qryQuestions = (from q in db.table1
                where q.ID == ID amp;amp; q.categoryID == categoryID
                select new {questionOrder= q.questionOrder, value2 = q.Value2})
               .Union
               (from qp in db.table2
                where qp.ID == ID amp;amp; qp.categoryID == categoryID
                select new {questionOrder= qp.questionOrder, value2 = qp.Value2}))
               .OrderBy(x => x.questionOrder);
  

Причина этого в том, что вы пытаетесь выделить совершенно разные объекты, т. Е. q != qp, поскольку они не из одной таблицы.

Ответ №2:

Что произойдет, если выполнить объединение перед оформлением заказа?

 var qryQuestions = (from q in db.table1
                    where q.ID == ID amp;amp; q.categoryID == categoryID
                    select q)
                   .Union
                   (from qp in db.table2
                    where qp.ID == ID amp;amp; qp.categoryID == categoryID
                    select qp)
                   .OrderBy(x => x.questionOrder);
  

Комментарии:

1. снова те же ошибки. Даже если я не использую OrderBy, это все равно выдает мне те же ошибки. Просто не позволяет мне использовать объединение здесь.

Ответ №3:

Хотя ответ Кельвина частично верен (две части объединения должны быть одного типа / сущности), синтаксис IQueryable.Union() работает с параметром IEnumerable. Попробуйте следующее.

 var qryQuestions = (from q in db.table1
                where q.ID == ID amp;amp; q.categoryID == categoryID
                select new {questionOrder= q.questionOrder, value2 = q.Value2})
               .Union
               ((from qp in db.table2
                 where qp.ID == ID amp;amp; qp.categoryID == categoryID
                 select new {questionOrder= qp.questionOrder, value2 = qp.Value2})
                .AsEnumerable())
               .OrderBy(x => x.questionOrder);