Загрузка записей из модели данных EF в пользовательском / предварительно определенном порядке с использованием LINQ - PullRequest
2 голосов
/ 28 марта 2012

У меня есть список идентификаторов записей, разделенных запятыми:

 string = "2207,117,90,2168,120,118,113,112,17"

Мне нужно иметь возможность загружать записи, с которыми связаны эти идентификаторы, в той позиции, в которой они находятся в этой строке.

Вот код, который я использую для получения моих данных, используя LINQ to EF с методами LINQ:

 var styles = db.DataModel.Categories.Where(c => c.CategoryTypeID == 5 && c.Enabled).OrderBy(c => c.Name).ToList();

В любом случае, можно ли изменить приведенный выше запрос, чтобы получить записи в том порядке, в котором они находятся в приведенном выше списке идентификаторов записей?

Я не уверен, как это сделать. Любая помощь / пример будет принята с благодарностью.

Я использую методы LINQ для EF 4.0 + C #

Спасибо!

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Вы можете отсортировать по индексу во входном массиве после использования AsEnumerable():

var input = "2207,117,90,2168,120,118,113,112,17".Split(',');
var recordIds = Array.ConvertAll(input, int.Parse);

var styles = db.DataModel
                .Categories
                .Where(c => c.CategoryTypeID == 5 && c.Enabled && recordIds.Contains(c.ID))
                .AsEnumerable()
                .OrderBy(c => Array.IndexOf(recordIds, c.ID))
                .ToList();

Выше предполагается, что вы хотите загрузить все Category объекты, которые имеют идентификатор, содержащийся в recordIds,Как только они найдены, вы упорядочиваете их по индексу в массиве.

0 голосов
/ 28 марта 2012

Если вы не хотите использовать Linq-to-objects, вы можете сделать следующее:

int[] ids =  "2207,117,90,2168,120,118,113,112,17".Split(',').Select(x => int.Parse(x)).ToArray();


var styles = from c in db.DataModel.Categories
             join i in ids on c.ID equals i
             where c.CategoryTypeID == 5 && c.Enabled
             select x;
0 голосов
/ 28 марта 2012

Вы можете использовать разделенный запятыми фильтр взлома списка:

...Where(c => ("," + myString + ",").IndexOf("," + c.CatgeoryID + ",") != -1)...

Используя подобную технику, вы можете получить их обратно в том же порядке:

...OrderBy (c => ("," + myString + ",").IndexOf("," + c.CategoryID + ","))...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...