我有这个匹配条件:
var matchConditions = new long[][]
{
new long[] { 109, 145 }, //color Id
new long[] { 202 }, // province Id
new long[] { 303, 309, 317, 318 }, //options Id
};
它们中的每一个都是不同组的id,例如第一个嵌套数组用于颜色
我需要知道哪些产品符合颜色id 109或145,第二种产品符合其他颜色。
我的意思是我希望获得满足所有每个组中任何项目的所有产品,
{color 109 或 145 - 和 - 省202 - 和 - 选项303 或 309 或 317 或 318}
我试过了:
matchConditions.ToList().ForEach(x => x.Any(j => adAdFields.Select(co => co.listFieldId).Contains(j)))
和
matchConditions.All(x => x.Any(j => adAdFields.Select(co => co.listFieldId).Contains(j)))
但它们都不起作用
修改 在此之前我有这个问题:
var adsWithRelevantadFields =
from adField in cwContext.tblAdFields
join ads in cwContext.tblAds on adField.adId equals ads.id
where (prvId == 0 && ads.tabId == tabId) ||
(prvId != 0 & ctsId.Value == 0 && ads.provinceId == prvId & ads.tabId == tabId) ||
(prvId != 0 & ctsId.Value > 0 && ads.provinceId == prvId & ads.cityId == ctsId.Value & ads.tabId == tabId)
where ads.endDate >= theToDay
where ads.conditionId == 1
where ads.payed == true
group adField by adField.adId into adAdFields
where searchIds.All(i => adAdFields.Select(co => co.listFieldId).Contains(i))
这项工作做得很好,但现在我需要搜索更多按照我展示的分组选项,所以我需要添加“&&”结束查询以搜索这些新项目,这是我的问题。
EDIT2
让我假设我有一些列表(颜色,谁生产,选项,哪里,......)现在当我想添加新产品时,添加这些格式的适当属性(productId,attributeId),所以例如我有(1,109) - 1,202 - 1,303 ......)和(2,109 - 2,202 - 2,318 ......)...
因此,我将每个产品(实际广告)分组,我只需要检查哪些产品grop:
{color 109 或 145 - 和 - 省202 - 和 - 选项303 或 309 或< / em> 317 或 318}
答案 0 :(得分:3)
这样的事情怎么样?
adAdFields.Where(x => matchConditions[0].Contains(x.colorId)
&& matchConditions[1].Contains(x.provinceId)
&& matchConditions[2].Contains(x.optionsId))
.ToList();
答案 1 :(得分:1)
我认为您需要逐步查询,如何逐步构建此查询,在这种情况下,您可以提高代码的可读性并检查所有条件的可用性。
看看这个:
class Program
{
static void Main(string[] args)
{
var adAdFields = new List<AdAdField>
{
new AdAdField {colorId = 109, optionsId = 303, provinceId = 202},
new AdAdField {colorId = 145, optionsId = 309, provinceId = 2},
new AdAdField {colorId = 3, optionsId = 317, provinceId = 3},
new AdAdField {colorId = 4, optionsId = 318, provinceId = 4}
}.AsQueryable();
var matchConditions = new long[][]
{
new long[] { 109, 145 }, //color Id
new long[] { 202 }, // province Id
new long[] { 303, 309, 317, 318 }, //options Id
};
var result1 = adAdFields.Where(x => matchConditions[0].Contains(x.colorId)
&& matchConditions[1].Contains(x.provinceId)
&& matchConditions[2].Contains(x.optionsId)).ToList();
var query = adAdFields;
if (matchConditions[0].Length > 0)
query = query.Where(x => matchConditions[0].Contains(x.colorId));
if (matchConditions[1].Length > 0)
query = query.Where(x => matchConditions[1].Contains(x.provinceId));
if (matchConditions[2].Length > 0)
query = query.Where(x => matchConditions[2].Contains(x.optionsId));
//below will be other possible conditions....
var result2 = query.ToList();
//result2 and result1 ARE SAME!!!
}
}
public class AdAdField
{
public int colorId { get; set; }
public int provinceId { get; set; }
public int optionsId { get; set; }
}
IQueriable将为查询添加条件,最终在查询结束时您将调用.ToList()
,并强制orm生成适当的sql。在此之前,您只需构建查询。
答案 2 :(得分:0)
您可以使用动态linq来构造类似于@ Selman22答案中的linq查询,具有不同数量的条件。基本上,linq查询由一个带有表达式的树组成。 动态LINQ意味着您可以动态地构建树,从而为创建查询提供更多功能。
您可以使用PredicateBuilder执行此操作,或使用现成的库(如dynamic-query-library)。 参见:
http://www.codeproject.com/Articles/231706/Dynamic-query-with-Linq