IEnumerable не обновляется должным образом в цикле foreach (используется; C #, MVC2 & Linq) - PullRequest
1 голос
/ 09 января 2011

У меня есть три таблицы Tbl_Listings, Tbl_AttributesLU и Tbl_ListingAttributes.

Tbl_Listings содержит все мои списки. Tbl_AttributesLU содержит ряд атрибутов (имя с идентификатором) Tbl_ListingAttributes содержит несколько атрибутов для каждого списка.

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

Для этого я сначала отправляю все атрибуты, выбранные пользователем, в мою ViewModel в виде списка, называемого AttributesFromView.

Затем я получаю все свои списки и помещаю их в коллекцию IEnumarable, называемую ListingsInDB.

Затем я создаю цикл foreach, пытаясь сузить список на основе каждого атрибута в AttributesFromView. Ниже приведен код.

IEnumerable<Listing> ListingsInDB = from x in DBEntities.Tbl_ListingSet select x;

foreach (int Attribute in AttributesFromView)
{
    ListingsInDB = (from x in ListingsInDB
                    from a in x.Tbl_ListingAttributes
                    where a.Tbl_AttributesLU.ID == Attribute
                    select x);
}

Теперь, поскольку моя коллекция ListingsInDB находится за пределами цикла foreach, я предполагаю, что на каждой итерации цикла foreach она должна сужать коллекцию, выбирая только списки с конкретными прикрепленными атрибутами. Таким образом, на первой итерации он будет выбирать все списки, которые имеют AttributesFromView [0]. Затем (на следующей итерации) из этой недавно обновленной коллекции ListingsInDB он выберет все дальнейшие списки, имеющие AttributesFromView [1] и т. Д. ...

Это, однако, не работает. Вместо этого он всегда будет выбирать элементы с последним атрибутом в списке AttributesFromView. Я немного смущен тем, почему это происходит, и буду очень признателен за помощь в решении проблемы.

Кроме того, извинения за то, что название очень расплывчато - я действительно не знал, как сформулировать этот вопрос.

Заранее спасибо,

Sheefy

1 Ответ

1 голос
/ 09 января 2011

Вы закрываете переменную цикла, которая считается вредной .

Один из способов исправить это - скопировать значение переменной цикла:

foreach (int attribute in AttributesFromView)
{
    int attribute2 = attribute;
    ListingsInDB = (from x in ListingsInDB
                    from a in x.Tbl_ListingAttributes
                    where a.Tbl_AttributesLU.ID == attribute2
                    select x);
}
...