LINQ包含所有组的每个元素?

时间:2014-02-11 04:26:44

标签: c# linq

我有这个匹配条件:

            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}

3 个答案:

答案 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

http://msdn.microsoft.com/en-us/library/bb882637.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx