0

以下のlinqステートメントがあります。ループなしでこれを解決するにはどうすればよいですか。これはタグ システムであり、"myints" の ID を持つタグを持つ演習のみが必要です。

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);
  }
4

3 に答える 3

0

Contains()必要なものにかなり近いので、独自のContainsAll()関数を使用してください。

public static bool ContainsAll<T>(this IEnumerable<T> sequence, params T[] matches)
{
    return matches.All(value => sequence.Contains(value));
}
于 2012-10-09T17:08:50.517 に答える
0

クエリに基づいて少し推測しますが、このようなものですか?

(編集- 複数の一致するタグが見つかった場合、最初の例では重複した演習が返されることに気付きました)

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))  
        );
于 2012-10-09T16:24:53.337 に答える
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;
于 2012-10-09T20:24:40.537 に答える