Linq-версия SQL-оператора IN - PullRequest
22 голосов
/ 22 мая 2009

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

== Предметы ==

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

== Теги ==

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

== TagMap ==

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

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

Ответы [ 6 ]

49 голосов
/ 22 мая 2009

Что-то вроде

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 с параметрами, если я не ошибаюсь).

15 голосов
/ 22 мая 2009

заданный массив предметов:

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

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

where list.Contains(tm.TagId)
1 голос
/ 15 июля 2013

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

var TagIds = {12, 32, 42}
var prod =entities.TagMaps.Where(tagmaps=> TagIds .Contains(tagmaps.TagId));
1 голос
/ 22 мая 2009
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();
0 голосов
/ 30 апреля 2019

Вы можете создать метод расширения "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;

Или просто используйте встроенный массив. Содержит () запись:

var q = from map in Context.TagMaps 
        where new[]{2, 3, 4, 7}.Contains(map.TagId)
        select map.Items;
0 голосов
/ 28 декабря 2014
string[] names = {"John", "Cassandra", "Sarah"};

var results = (from n in db.Names
               where names.Contains(n.Name)
               select n).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...