2011-12-29 3 views
6

У меня есть набор идентификационных номеров, на которые я хочу вернуть какой-либо объект, я делаю это, используя инструкцию linq, где используется инструкция содержит:Linq Где Содержит ... Сохранить по умолчанию

var recentCats = (from i in EntityCache.Default.GetAll<Categories>() 
          where WebProfile.Current.RecentlyCreatedCategories.Contains(i.Id) 
          && BoundCategory.ParentItemClass.Id.Equals(i.ParentItemClass.Id) 
          select new CategoryInfo() 
          { 
           Category = i, 
           ClassId = i.ParentItemClass.Id, 
           ClassImage = NamedResourceManager.GetResourceBinary(i.ParentItemClass.NameResourceId) 
          }); 

Это прекрасно работает, за исключением того, что я хочу сохранить порядок элементов в возвращенной коллекции так же, как и в списке, который входит. Так, например, если бы у меня был список идентификаторов: 14, 603, 388, я хочу, чтобы объекты возвращались в том же порядке, а не в том порядке, в котором они были возвращены кешем. Есть ли какой-либо путь в инфраструктуре сущности для этого или какой-либо способ сделать это, что не предполагает, что я пишу цикл foreach?

Благодаря

+0

Извините, у вас нет времени на полный ответ, но я могу дать вам подсказку. Это связано с присоединением вашего идентификационного списка к списку категорий вместо использования 'where ... contains' – Ray

+0

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

ответ

1

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

var recentCats = (from i in WebProfile.Current.RecentlyCreatedCategories 
           join b in allCats 
           on i equals b.Id 
           where BoundCategory.ParentItemClass.Id.Equals(b.ParentItemClass.Id) 
           select ... 

Еще раз спасибо за вашу помощь. & ответов.

3

ГДЕ расширение Linq, как и большинство расширений сохраняет первоначальный порядок списка.

Do LINQ's Enumerable Methods Maintain Relative Order of Elements?

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


Причина, по которой вышеуказанная информация не относится к данному вопросу, приведена в комментариях ниже. Я бы предложил изменить вывод выбора как пары ключ/значение, где ключ - это индекс идентификатора в вашем списке, а значение - ваш новый объект, а затем orderBy ключ в результирующем наборе и выберите Значение.

+0

Это LINQ to Objects. Он использует EF, который вернет заказ с SQL Server. – SLaks

+0

@SLaks благодарю вас за информацию, я отредактировал свой ответ с возможным решением. – Gent

+0

Спасибо за объяснение и ссылку. Это не совсем то, что я ищу, хотя, как я не думаю, что я был достаточно конкретным в моем вопросе. В настоящий момент мои результаты возвращаются в том порядке, в котором они находятся в кеше, поскольку это запрос, который я запускаю, - я хотел, чтобы они были в порядке списка, который я проверяю. Я могу сделать это, используя соединение, упомянутое выше, вместо предложения contains. –

Смежные вопросы