Подтвердить что ты не робот

Linq-версия инструкции SQL "IN"

У меня есть следующие 3 таблицы как часть простой схемы тегов элементов:

== == Элементы

  • ItemId int
  • Марка varchar
  • Имя varchar
  • Ценовые деньги
  • Условие varchar
  • Описание varchar
  • Активный бит

== Теги ==

  • TagId int
  • Имя varchar
  • Активный бит

== TagMap ==

  • TagMapId int
  • TagId int (fk)
  • ItemId int (fk)
  • Активный бит

Я хочу написать запрос LINQ, чтобы вернуть элементы, которые соответствуют списку тегов (например, TagId = 2,3,4,7). В моем контексте приложения примерами будут "Компьютерный монитор", "Платье-рубашка", "Гитара" и т.д., А примерами меток могут быть "электроника", "одежда" и т.д. Я обычно делаю это с помощью SQL IN.

4b9b3361

Ответ 1

Что-то вроде

var TagIds = new int[] {12, 32, 42};

var q = from map in Context.TagMaps 
        where TagIds.Contains(map.TagId)
        select map.Items;

должен делать то, что вам нужно. Это будет генерировать предложение In (12, 32, 42) (или, более конкретно, параметризованное предложение IN, если я не ошибаюсь).

Ответ 2

заданный массив элементов:

var list = new int[] {2,3,4}

использование:

where list.Contains(tm.TagId)

Ответ 4

List<int> tagIds = new List<int>() {2, 3, 4, 7};
int tagIdCount = tagIds.Count;
    //
// Items that have any of the tags
//  (any item may have any of the tags, not necessarily all of them
    //
var ItemsAnyTags = db.Items
  .Where(item => item.TagMaps
    .Any(tm => tagIds.Contains(tm.TagId))
  );

    //
// Items that have ALL of the tags
//  (any item may have extra tags that are not mentioned).
    //
var ItemIdsForAllTags = db.TagMap
  .Where(tm => tagIds.Contains(tm.TagId))
  .GroupBy(tm => tm.ItemId)
  .Where(g => g.Count() == tagIdCount)
  .Select(g => g.Key);
    //
var ItemsWithAllTags = db.Items
  .Where(item => ItemsIdsForAllTags.Contains(item.ItemId));

//runs just one query against the database
List<Item> result = ItemsWithAllTags.ToList();

Ответ 5

Вы можете просто использовать

var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));

Ответ 6

string[] names = {"John", "Cassandra", "Sarah"};

var results = (from n in db.Names
               where names.Contains(n.Name)
               select n).ToList();

Ответ 7

Вы можете создать метод расширения "IN()"

public static class Extension
{
    public static bool IN(this object anyObject, params object[] list)
    { return list.Contains(anyObject); }
}

использоваться таким образом

var q = from map in Context.TagMaps 
        where map.TagId.IN(2, 3, 4, 7)
        select map.Items;