2014-01-18 113 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更新。 –