是否可以将两个IQueryable一起添加?

时间:2010-08-16 10:44:03

标签: collections arraylist generics iqueryable

我一直在IQueryable上使用Union<> (使用相同的类型)尝试从两个集合中生成一个集合,但它不起作用。我相信我的理解与IQueryable成员有关。

我以为我可以使用union方法构建(在foreach中)一个SQL语句,该语句将执行如下操作:

SELECT * FROM MYTABLE WHERE FK = 1
UNION
SELECT * FROM MYTABLE WHERE FK = 9
UNION
SELECT * FROM MYTABLE WHERE FK = 15

以前我曾经认为必须有一个方法可以产生与两个IQueryable相同的效果,就像旧的最喜欢的ArrayList的AddRange一样,这实际上是我在这里想要实现的基础。

4 个答案:

答案 0 :(得分:4)

实际上,这完全符合预期:

var q1 = from c in db.Customers where c.CustomerID.StartsWith("A") select c;
var q2 = from c in db.Customers where c.CustomerID.StartsWith("B") select c;
var q3 = from c in db.Customers where c.CustomerID.StartsWith("C") select c;

var q4 = q1.Union(q2).Union(q3);

(我正在使用Northwind数据库)。它生成一个SQL语句,用于对三个查询进行联合。

更新:我想我误解了你在“循环中”的含义。这可以正常工作:)

static void Main(string[] args)
{
    var db = new NorthwindDataContext();
    IQueryable<Customer> query = from c in db.Customers 
                                 where c.CustomerID.StartsWith("A") 
                                 select c;

    foreach (var ch in "EIOV")
    {
        var chh = ch.ToString();  // separate variable so closure work right

        query = query.Union(from c in db.Customers 
                            where c.CustomerID.StartsWith(chh) 
                            select c);
    }

    foreach (var c in query)
    {
        Console.WriteLine(c.CompanyName);
    }
}

答案 1 :(得分:1)

我终于通过使用List&lt;&gt;来解决这个问题。并简单地调用AddRange()。列表完成后,我调用list.AsQueryable()来取回IQueryable集合。

这是最好的方法吗? 这将为列表的每次添加创建一个SQL调用 - 是否无法创建正确的UNION语句?

答案 2 :(得分:0)

IQueryable.Concat()会成为你想要的吗?

答案 3 :(得分:0)

您可以尝试这样的事情:

var qry = 
new [] {
    "one", "two", "three", "four"
}
.Select(z=>MyTable.Where(x=>x.Number==z))
.Aggregate((a,x)=>a.Union(x))
.ToList();

这样做会创建一个IQueryable,然后您可以实现(参见ToList())以生成单个服务器端语句。