LINQ to SQL Query против таблицы мостов - PullRequest
1 голос
/ 09 июля 2011

У меня проблемы с запросом LINQ to SQL в следующем сценарии:

  • У меня есть элементы, к которым "Теги" применены через таблицу моста.
  • I 'm пытается отфильтровать список элементов в подмножестве, которое содержит весь указанный набор тегов и вернуть отфильтрованный список элементов в качестве результата запроса.

Вовлеченные таблицы:

Item (ItemId, Name, ...other fields)
Tag (TagId, TagName)
Item_Tag(ItemId, TagId)

Например, если бы у меня был список предметов с тегами:

  • Item1 w / (Tag1, Tag2)
  • Item2 w / (Tag1, Tag2)
  • Item3 w / (Tag1)

, и я хотел получить все элементы, у которых есть теги Tag1 и Tag2, где требование фильтра предоставляется в виде int [] требуемого tagIds.

Предполагая, что Item и Tag Id совпадают с номером в конце имени.Фильтр для этого примера будет выглядеть следующим образом:

int[] tagFilterConditions = int[2]{1, 2};

var query = from i in itemList
//define filter here

, где результат будет: Item1, Item2 (исключая Item 3 b / c, он не помечен как Tag1 AND Tag2)

IМне трудно разобраться, как объединить эти таблицы для применения этого фильтра в исходном списке. Я пытался использовать построитель предикатов и различные объединения, но просто не могу получить правильные результаты.

Спасибо за любую помощь ...

Ответы [ 4 ]

0 голосов
/ 11 июля 2011

Получил следующий запрос для работы с анонимным типом после определения правильных отношений внешнего ключа, запрос был адаптирован из ответа на на этот вопрос.

//the tagId's that the item in itemList must have
int[] tagFilterConditions = int[2]{1, 2};

var query =  
    itemList.Select( i=> new { i, itemTags= item.Item_Tags.Select(it=> it.TagId)})
            .Where( x=> tagFilterConditions.All( t=> x.itemTags.Contains(t)))
            .Select(x=> x.s);
0 голосов
/ 09 июля 2011
// Query for all the items in the list
int[] itemIds = itemList.Select(item => item.ItemId).AsArray();
var query =
    db.Item.Where(item =>
        itemIds.Contains(item.ItemId));

// Apply each tag condition
foreach (int tagid in tagFilterConditions)
{
    int temp = tagid;
    query = query.Where(item =>
        db.Item_Tag.Exists(item_tag =>
            item_tag.ItemId == item.ItemId && item_tag.TagId == temp)));
}
0 голосов
/ 09 июля 2011

Здесь - это немного sql.

и здесь - это LinqToSql ..

0 голосов
/ 09 июля 2011

Я думаю, что ответ на ваш вопрос находится в .Contains (): http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql

Вот, что я думаю, это соответствующий фрагмент этого сайта на ваш вопрос:

int[] productList = new int[] { 1, 2, 3, 4 };

var myProducts = from p in db.Products
             where productList.Contains(p.ProductID)
            select p;

Надеюсь, это поможет!

...