2011-11-12 98 views
1

我想在我的代码使用一个联盟:使用联盟与System.Linq.IQueryable

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

,我得到的错误信息:

错误15“System.Linq.IOrderedQueryable <表1> '不包含一个定义 '联盟',最好的扩展方法过载' System.Linq.ParallelEnumerable.Union < TSource>(System.Linq.ParallelQuery < TSource>,System.Collections.Generic.IEnumerable < TSource> )'有一些无效论据

错误30实例参数:无法从 'System.Linq.IOrderedQueryable <表1>' 到 'System.Linq.ParallelQuery <表2>'

回答

1

会发生什么转变如果您在订购之前执行工会?

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

再次出现相同的错误。即使我不使用OrderBy,它仍然给我同样的错误。只是不让我在这里使用联盟。 – Ratan

2

这是因为您正在选择两组不同的数据集,Linq无法理解您要做什么。

代替....选择Q和....选择QP

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

这样做的原因是,你想选择完全不同的实体了! - 即Q = QP,因为他们不是来自同一张桌子。

0

尽管Kelvin的答案部分正确(联合的两个部分必须是相同的类型/实体),但IQueryable.Union()的语法与IEnumerable参数一起使用。尝试以下操作。

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