2012-02-12 76 views
1

在数据库中,我有一些产品和价格。 我需要搜索价格限制。问题是可能有几个限制。例如,0 - 500 $ 1500 - $ 2000年用空的LINQ查询联合结果

如何合并这LINQ查询

var products = from product in db.Products 
where product.Price >= 0 and product.Price <= 500 

var products = from product in db.Products 
where product.Price >= 1500 and product.Price <= 2000 

我varriant:

IQueryable<Deal> allResults = null; 
      for(var i = 0; i < price.Length - 1; i = i + 2) 
      { 
       decimal start,end; 
       decimal.TryParse(price[i], out start); 
       decimal.TryParse(price[i+1], out end); 

       var tempResults = from product in query 
         where (product.DiscountPrice >= start && product.DiscountPrice <=     end) 
         select product; 
        tempResults.Union(allResults); 
       } 

如何创建一个空的查询来加入?

+0

你想要一个联合还是联结?他们是两个不同的功能。 – 2012-02-12 13:23:03

回答

3

的一种方式是合并的条件:

var products = from product in db.Products 
where (product.Price >= 0 and product.Price <= 500)||product.Price >= 1500 and product.Price <= 2000 

另一种是使用UnionConcat

var products = (from product in db.Products 
        where product.Price >= 0 and product.Price <= 500) 
     .Union(from product in db.Products 
        where product.Price >= 1500 and product.Price <= 2000); 

修改代码可以:

IQueryable<Deal> allResults = null; 
for(var i = 0; i < price.Length - 1; i = i + 2) 
{ 
    decimal start,end; 
    decimal.TryParse(price[i], out start); 
    decimal.TryParse(price[i+1], out end); 

    var tempResults = from product in db.Products 
         where (product.DiscountPrice >= start && product.DiscountPrice <= end) 
         select product; 
    if(allResults!=null) 
     allResults=allResults.Union(tempResults); 
    else 
     allResults=tempResults; 
} 

你不需要一个空查询来合并,你可以添加一个特殊的例子来测试这是否是第一个查询。

但我不喜欢那个代码太多,因为它混合了两个问题:查询的构造和查询的合并。所以我把它分成两部分:

IEnumerable<Tuple<Decimal,Decimal>> ParsePrices(string[] rawPrices) 
{ 
    for(var i = 0; i < price.Length - 1; i = i + 2) 
    { 
     decimal start=decimal.Parse(price[i]); 
     decimal end =decimal.Parse(price[i+1]); 

     yield return Tuple.Create(start, end); 
} 

var prices=ParsePrices(rawPrices); 
IEnumerable<IQueryable<Deal>> partialQueries=prices.Select(interval=> 
     from product in db.Products 
     where (product.DiscountPrice >= interval.Item1 && product.DiscountPrice <= interval.Item2) 
     select product;); 
var mergedQuery=partialQueries.Aggregate((q1,q2)=>q1.Union(q2)); 
1

您可以使用Enumerable.Empty<T>().AsQueryable()创建一个空查询。

您在代码中存在的问题:Union不会将您传递给它的任何序列作为参数进行更改;相反,它会创建一个返回的新序列。因此,您应该将您的tempResults.Union(allResults)操作的结果分配给allResults

下面是一些示例代码(未测试):

IQueryable<Deal> filteredResults = Enumerable.Empty<Deal>().AsQueryable(); 

for (int i = 0; i < price.Length - 1; i += 2) 
{ 
    decimal start, end; 
    decimal.TryParse(price[i], out start); 
    decimal.TryParse(price[i+1], out end); 

    var tempResults = from product in db.Products 
         where product.DiscountPrice >= start && product.DiscountPrice <= end 
         select product; 

    filteredResults = filteredResults.Union(tempResults); 
}