我一直在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一样,这实际上是我在这里想要实现的基础。
答案 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())以生成单个服务器端语句。