2012-10-09 150 views
0

我有下面的linq語句。我怎樣才能解決這個沒有循環。它是一個標籤系統,我只想要一點點根據您的查詢,但這樣的事情是對以「myints」優化LINQ語句

int[] myints = {1,2}; 
    foreach (int tagid_temp in myints) 
    { 
    ExerciseByTagId = 
     (from exercise in context.ExerciseSet 
     where context.ItemsTagsSet 
       .Where(a => a.TagsId == tagid_temp) 
       .Select(a => a.ExerciseId).Contains(exercise.Id) 
     select exercise); 
    } 
+0

看起來你只是在循環的每個迭代中覆蓋'ExerciseByTagId'。所以它將始終分配循環的最後一次迭代的值。 – Magnus

回答

0

猜測與IDS標籤練習?

EDIT - 實現了我的第一個例子將返回重複練習如果發現多個匹配代碼)

INT [] myints = {1,2};

ExerciseByTagId = 
    context.ExerciseSet 
      .Where(e => context.ItemsTags 
           .Any(t=> t.ExerciseId == e.Id 
             && myints.Contains(t.TagsId) 
       ); 

要獲得所有相關項目都在列表中的項目:

int[] myints = new int[] {1,2}; 

var ExerciseByTagId = 
    context.ExerciseSet 
    .Where(
     e => context.ItemsTags 
        .Where(t=> t.ExerciseId == e.Id) 
        .All(t => myints.Contains(t.TagsId)) 
     ); 
+0

也許我有點不好解釋,但我只想要所有標籤都匹配「myint」的練習。 for循環給了我這個但不好的方式? – ahrberg

0

Contains()是非常接近你所需要的,所以用自己的ContainsAll()功能:

public static bool ContainsAll<T>(this IEnumerable<T> sequence, params T[] matches) 
{ 
    return matches.All(value => sequence.Contains(value)); 
} 
+1

這會將篩選器推送到客戶端而不是數據庫中,因爲您使用IEnumerable而不是IQueryable。 –

+0

但是沒有與「ContainsAll」函數等價的SQL。 –

0

我在短短的時間內測試了這個呃類似的數據庫結構,它會產生一個單一的SQL語句:

var selected = new [] {1,2}; 

var ex = from ts in context.ItemsTagsSet 
     where selected.Contains(ts.TagsId) 
     group ts by ts.ExerciseId into g select new 
     { 
      ExerciseId = g.Key, 
      Count  = g.Count() 
     } into x 
     where x.Count == selected.Length 
     join e in context.ExerciseSet on e.ExerciseId equals x.ExerciseId 
     select e;