2012-02-12 16 views
1

データベースには、いくつかの製品と価格があります。 私は価格の制限を検索する必要があります。問題はいくつかの制限があるかもしれないということです。例えば、0から500 $ 1500 - このLINQをマージする方法$ 2000年空の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

あなたは組合や結合をしたいですか?それらは2つの異なる機能です。 –

答えて

3

一つの方法は、条件をマージすることです:

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

もう一つは、UnionまたはConcatを使用することです:

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; 
} 

マージするには空のクエリは必要ありませんが、これが最初のクエリであるかどうかをテストする特別なケースを追加することができます。

しかし、私はそのコードが大変好きではありません。なぜなら、2つの懸念事項が混在しているからです。クエリの構成とクエリのマージです。だから私は2つに分割したいと思った:

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); 
} 
関連する問題