C# linq包含但较少

C# linq包含但较少,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个列表要搜索一个表 List<long> searchListIds = new List<long>(); searchListIds.Add(1); searchListIds.Add(2); List<long> searchListFieldValues = new List<long>(); searchListFieldValues.Add(100); searchListFieldValues.Add(50); 一切都正常,

我有一个列表要搜索一个表

List<long> searchListIds = new List<long>();
searchListIds.Add(1);
searchListIds.Add(2);

List<long> searchListFieldValues = new List<long>();
searchListFieldValues.Add(100);
searchListFieldValues.Add(50);
一切都正常,但现在:我需要获取所有满足小于SearchListFieldValue的记录。我的意思是:


listId==1&listFieldValue的所有adId下面是一个完整的示例,如果我正确理解您的意思,它应该可以工作:

class Program
{
    static void Main(string[] args)
    {
        List<int> searchListIds = new List<int>
        {
            1,
            2,
        };

        List<int> searchListFieldValues = new List<int>
        {
            100,
            50,
        };

        List<Tuple<int, int>> searchParameters = new List<Tuple<int,int>>();
        for (int i = 0; i < searchListIds.Count; i++)
        {
            searchParameters.Add(new Tuple<int,int>(searchListIds[i], searchListFieldValues[i]));
        }

        List<AdField> adFields = new List<AdField>
        {
            new AdField(1, 1, 1, 100),
            new AdField(2, 2, 1, 100),
            new AdField(3, 1, 2, 50),
            new AdField(4, 2, 2, 50),
            new AdField(5, 3, 1, 100),
            new AdField(6, 3, 2, 49),
            new AdField(7, 3, 3, 10)
        };

        var result = adFields.Where(af => searchParameters.Any(sp => af.ListId == sp.Item1 && af.ListFieldValue < sp.Item2)).Select(af => af.AdId).Distinct();

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }

        Console.Read();
    }

    public class AdField
    {
        public int Id { get; private set; }
        public int AdId { get; private set; }
        public int ListId { get; private set; }
        public int ListFieldValue { get; private set; }

        public AdField(int id, int adId, int listId, int listFieldValue)
        {
            Id = id;
            AdId = adId;
            ListId = listId;
            ListFieldValue = listFieldValue;
        }
    }
}

首先,您可能正在寻找的是的功能,而不是包含。另一件事是,如果您的搜索条件由两个项目组成,请使用一个列表而不是两个列表。在这种情况下,您将能够通过组合listId和fieldValue进行高效搜索:

您应该尝试将Contains更改为Any,但我不确定linqto实体是否能将其正确地转换为正确的SQL语句

var adsWithRelevantadFields =
    from adField in cwContext.tblAdFields
    group adField by adField.adId into adAdFields
    where searchListIds.All(i => adAdFields.Select(co => co.listId).Contains(i))
        && searchListFieldValues.All(i => adAdFields.Select(co => co.listFieldValue).Any(x => x < i))
    select adAdFields.Key;

所以两个列表的大小总是一样的?@Anatolii Gabuza是的,我听说过concat,但我不能使用,现在的问题是包含less。请给出一个输入数据cwContext.tblAdFields的示例,以及您期望从该数据adsWithRelevantadFields得到的结果?@mrzli为什么不,如何告诉你?我想你是在寻找。我认为你不是答案。谢谢你。我认为你的答案就像“MeZLI”,不管你是对的,Tuple是更好的,但是我以前没有听说过。你没有考虑Adfield的Adfield。AdID进入AddField:我们必须在Addfield上工作,而不是Adfield或TBADFELD。现在,mohammadadibi Updated.you必须在Addfield上工作,而不是Adfield,而我们之前必须对它们进行分组,现在必须在成组的字段上工作。如果我不知道我帮不了你。我不知道在你的例子中这个分组的目的是什么。好吧,让我解释一下,我有tblAdFields,每个广告,有很多字段记录在表中,例如我们有3个列表home\u room,home\u price,home\u wallpaper,然后一些列表有价值,假设home\u room:1,2,3…/然后每个广告部分到tblAdFields。现在我们要搜索每个广告都有listIdhome\u room和listFieldValue2 room,或者超过2个room,或者…/在这种情况下,我们首先需要组adId,然后搜索、过滤它们。您的元组很好,这对我很有帮助,但我的问题是,对于分组参数,如果您看到我的代码,在少或多之前一切正常。这很好,谢谢,让我再次检查,然后标记答案。
class Program
{
    static void Main(string[] args)
    {
        List<int> searchListIds = new List<int>
        {
            1,
            2,
        };

        List<int> searchListFieldValues = new List<int>
        {
            100,
            50,
        };

        List<Tuple<int, int>> searchParameters = new List<Tuple<int,int>>();
        for (int i = 0; i < searchListIds.Count; i++)
        {
            searchParameters.Add(new Tuple<int,int>(searchListIds[i], searchListFieldValues[i]));
        }

        List<AdField> adFields = new List<AdField>
        {
            new AdField(1, 1, 1, 100),
            new AdField(2, 2, 1, 100),
            new AdField(3, 1, 2, 50),
            new AdField(4, 2, 2, 50),
            new AdField(5, 3, 1, 100),
            new AdField(6, 3, 2, 49),
            new AdField(7, 3, 3, 10)
        };

        var result = adFields.Where(af => searchParameters.Any(sp => af.ListId == sp.Item1 && af.ListFieldValue < sp.Item2)).Select(af => af.AdId).Distinct();

        foreach (var item in result)
        {
            Console.WriteLine(item);
        }

        Console.Read();
    }

    public class AdField
    {
        public int Id { get; private set; }
        public int AdId { get; private set; }
        public int ListId { get; private set; }
        public int ListFieldValue { get; private set; }

        public AdField(int id, int adId, int listId, int listFieldValue)
        {
            Id = id;
            AdId = adId;
            ListId = listId;
            ListFieldValue = listFieldValue;
        }
    }
}
var result = from adField in cwContext.tblAdFields
             where searchParams.Any(sp => adField.listId == sp.Item1 && adField.listFieldValue < sp.Item2)
             group adField by adField.adId into adAdFields
             select adAdField.Key;  
var adsWithRelevantadFields =
    from adField in cwContext.tblAdFields
    group adField by adField.adId into adAdFields
    where searchListIds.All(i => adAdFields.Select(co => co.listId).Contains(i))
        && searchListFieldValues.All(i => adAdFields.Select(co => co.listFieldValue).Any(x => x < i))
    select adAdFields.Key;