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.
Ответы
Ответ 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)
Ответ 3
Отъезд Создание запросов IN с Linq To Sql
Ответ 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;