LINQ - использование выбранной коллекции между методами / классами - PullRequest
0 голосов
/ 29 декабря 2011

После долгих поисков я не смог найти ничего, что бы четко описывало, почему я вижу это поведение (и я предполагаю, что это что-то очень простое, что мне не хватает - я все еще очень начинающий :))

У меня есть метод (RefreshFilter), который принимает объект (rfp) в качестве параметра.У rfp есть свойство с именем 'Items', имеющее тип List.

У меня есть 2 вызова RefreshFilter, которые выглядят так:

rfp = RefreshFilter(rfp, FilteredBy.Category)
rfp = RefreshFilter(rfp, FilteredBy.Industry)

Вот метод RefreshFilter:

public FilterParams RefreshFilterList(FilterParams rfp, FilteredBy filteredBy)
{
    using (myEntity context as new myEntity())
    {
        itemsInCategory = (from i in context.items
                           join ic in context.ItemsCategories on i.Id equals ic.items.id
                           where ic.Categories.Id == '52'
                           select i).ToList<items>();

        rfp.Items = rfp.Items.Intersect(itemsInCategory).ToList<items>();
    }
    return rfp;
}

Первый вызов RefreshFilter (...) работает нормально и возвращает объект FilterParams со свойством .items, который содержит пересеченный список.

Второй вызов RefreshFilter (...) всегда возвращает объект FilterParams со свойством .items, содержащим список 0 элементов (что не ожидается, поскольку я знаю, что в списках есть совпадающие элементы).

После некоторого тестирования, я думаю, я смог сузить это до связи с контекстом, в котором установлен rfp.Items. Однако у меня всегда было впечатление, что правильный способ делиться коллекциями между контекстами - это выбирать их всобирать объекты и передавать их, но кажется, что эти объекты каким-то образом связаны с их начальным контекстом.

Спасибо,

1 Ответ

0 голосов
/ 29 декабря 2011

Попробуйте это:

public FilterParams RefreshFilterList(FilterParams rfp, FilteredBy filteredBy)
{
    using (myEntity context as new myEntity())
    {
        itemIdsInCategory = (from i in context.items
                           join ic in context.ItemsCategories on i.Id equals ic.items.id
                           where ic.Categories.Id == '52'
                           select i.Id).ToList<int>();

        rfp.Items = rfp.Items.Where(i => itemIdsInCategory.Contains(i.Id)).ToList<Item>();
    }
    return rfp;
}

Здесь мы сравниваем только уникальные идентификаторы предметов (в данном случае int), которые также могут повысить производительность.

...