2014-01-18 14 views
0

我有如下表:EF LINQ '凡' 有2场在同一时间

id    (bigint) 
adId   (bigint) 
listId   (bigint) 
listFieldValue (bigint) 

而且我有这样的搜索列表:

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

于是我就用:

using (ClearWhiteDBEntities cwContext = new ClearWhiteDBEntities()) 
{ 
    var adsWithRelevantadFields = 
     from adField in cwContext.tblAdFields 
     join ads in cwContext.tblAds on adField.adId equals ads.id 
     group adField by adField.adId into adAdFields 
     where searchListFieldIds.All(i => adAdFields.Select(co => co.listFieldValue).Contains(i)) 
     select adAdFields.Key; 

    MessageBox.Show(adsWithRelevantadFields.Count().ToString()); 
} 

但现在我需要同时检查两个字段listIdlistFieldId,所以我创建了另一个搜索列表:

List<long> searchListIds = new List<long>(); 
searchListIds.Add(11); 
searchListIds.Add(12); 

现在我需要把所有adId有(listId == 11 && listFieldValue==100)和(listId == 12 && listFieldValue==200

我想:

where searchListIds.All(i => adAdFields.Select(co => co.listId).Contains(i)) 
    && searchListFieldValues.All(i => adAdFields.Select(co => co.listFieldValue).Contains(i)) 

但它不工作。任何解决方案

+0

它以什么方式不起作用?它会给出错误的结果吗?抛出异常? –

+0

@Grant Winney谢谢。 –

+0

@Grant Winney错误的结果。 –

回答

0

如何将where子句放在group之前?

var adsWithRelevantadFields = 
    from adField in cwContext.tblAdFields 
    join ads in cwContext.tblAds on adField.adId equals ads.id 
    where ((adField.listId == 11 && adField.listFieldValue == 100) 
     || (adField.listId == 12 && adField.listFieldValue == 200) 
    group adField by adField.adId into adAdFields 
    select adAdFields.Key; 
+0

不,它返回错误的结果,我收集表中的每个广告字段,现在我需要知道哪些广告符合所有搜索字段。 –

+0

了解,我只是谈论listFieldValues,假设ad1值是(1,2,3),ad2值是(2,3,4),我的搜索是所有广告至少有(1,2),您的代码返回这两个广告,但答案是ad1。 –