2014-01-18 55 views
0

我有一个列表来搜索一个表,LINQ包含但不

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

List<long> searchListFieldValues = new List<long>(); 
searchListFieldValues.Add(100); 
searchListFieldValues.Add(50); 

和我的查询是:

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).Contains(i)) 
    select adAdFields.Key; 

一切正常,但现在我需要得到满足的所有记录小于searchListFieldValues。我的意思是:

(listId == 1)&(listFieldValue <100)(listId == 2)&(listFieldValue <50)所有的AdID

包含部分必须更改为类似包含少


例如:

cwContext.tblAdFields:

id    1  2  3  4 5 6 7 
adId   1  2  1  2 3 3 3 
listId   1  1  2  2 1 2 3 
listfieldValue 100 100 50 50 100 49 10 

现在,如果我要得到我的(listId == 1)&(listFieldValue ==100) AND (listId == 2)&(listFieldValue ==50)代码工作,并返回ID广告ID:1,2

,但我不能让

所有的AdID有(listId == 1)&(listFieldValue ==100) AND (listId == 2)&(listFieldValue <50)

它必须返回3

+0

所以这两个列表的大小总是相同的? –

+0

@Anatolii Gabuza是的,我听说过concat,但我无法使用,现在的任何问题是包含更少 –

+0

您可以举一个输入数据(cwContext.tblAdFields)的例子和您期望从该数据的结果(adsWithRelevantadFields )? – mrzli

回答

0

你应该试着改变ContainsAny,但我不知道,如果LINQ到实体将它正确转换转换为正确的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; 
+0

很棒,谢谢,让我来仔细检查,然后回答。 –

0

这是一个完整的例子,应该工作,如果我正确地理解你:

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

谢谢你让我检查。 –

+0

您不认为“将adField.adId组成的adField组合到adAdFields中”我们必须处理“adAdFields”而不是“adField或tblAdFields”,我们之前将它们分组,现在必须在分组字段上工作。 –

+0

@mohammadadibi我不清楚你到底想要完成什么。如果我不知道我无法帮助你。我不知道你的例子中这个分组的目的是什么。 – mrzli

0

首先,您可能正在寻找功能Any()而不是Contains()。另一件事是,如果您的搜索条件包含两项 - 使用列表Tuple<int,int>而不是两个列表。在这种情况下,你都会电子能够通过有效的listIdfieldValue方法组合进行搜索:

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; 
+0

谢谢我认为你的答案就像@mezli,你是任何方式对,Tuple比较好,但我之前没有听说过。 –

+0

您并不认为“将adField.adId组成的adField组合到adAdFields”我们必须处理“adAdFields”而不是“adField或tblAdFields”,我们之前将它们分组,现在必须在分组字段上工作。 –

+0

@mohammadadibi更新。 –