在数据库中,我有一些产品和价格。 我需要搜索价格限制。问题是可能存在一些限制。例如,0 - 500 $ 1500 - $ 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
我的变种:
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 :(得分: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;
}
您不需要合并的空查询,只需添加一个特殊情况来测试这是否是第一个查询。
但是我不喜欢那些代码,因为它混合了两个问题:查询的构造和查询的合并。所以我把它分成两部分:
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 :(得分:2)
您可以使用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);
}