Может ли LINQ упорядочить по индексу столбца? - PullRequest
3 голосов
/ 20 июля 2010

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

Спасибо

Ответы [ 5 ]

4 голосов
/ 20 июля 2010

В LINQ нет такого понятия, как столбец, только поля и свойства. Возможно, вы имеете в виду указание индекса свойства в анонимном типе, который вы создаете:

from p in persons
orderby 1
select new { p.FirstNam, p.LastName }

Это невозможно, потому что а) вы не можете упорядочить по свойству проекции (выходное значение в анонимном типе), и б) вы не можете упорядочить по индексу. Чтобы обойти а), вы можете использовать ключевое слово "в":

from p in persons
orderby p.FirstName
select new { First = p.FirstName, Last = p.LastName }
into tmp
   orderby tmp.First
   select tmp;

Если вы используете провайдера LINQ на основе IQueryable (например, LINQ to SQL, в отличие от LINQ для объектов на основе IEnumerable), вы можете проанализировать дерево выражений, найти выражение на основе некоторого индекса и добавить соответствующий Вызов метода OrderBy.

var query = from p in persons 
            select new { Name = p.FirstName + " " + p.LastName, ...}
query = AddOrderByPosition (query, 1);
foreach (var p in query) {...}

AddOrderByPosition должен будет создать новое дерево выражений, которое использует исходное выражение запроса в качестве источника (подзапрос, который, по сути, тоже создает «в»), и добавить в конце вызов OrderBy (нет необходимости в Select ). Сначала вы хотите прочитать главу о спецификациях C # о преобразовании выражений запросов, и у вас должен быть некоторый опыт работы с отражениями и выражениями, если вы хотите сделать это за разумное время.

Если вы хотите, у меня есть пример кода, который я могу предоставить.

2 голосов
/ 20 июля 2010

Я знаю, что невозможно изменить индекс.

1 голос
/ 20 июля 2010

В LinqToSql у вас есть класс, сопоставленный с базой данных, с именами свойств, которые не меняются. Эти свойства отображаются в базу данных с использованием атрибутов. Имя столбца базы данных содержится в атрибуте.

Если вы хотите изменить имя столбца во время разработки, вы можете использовать конструктор (если класс создается автоматически) или изменить атрибут самостоятельно.

Если вы хотите изменить имя столбца во время выполнения, вы должны предоставить XmlMappingSource . Это заменит отображение из атрибутов.

1 голос
/ 20 июля 2010

Я думаю, вы могли бы иметь в виду Выбор с индексатором? Если это так, то ниже приведен пример из одного из моих запросов Linq:

var tmp = 
    from container in Container
    where container.ContainerTypeID == 2
    select new { ContainerID = container.ContainerID, TypeID = container.ContainerTypeID};

// The indexer cannot be used with the query expression format, so we need to convert to dot notation.
// We also need to convert tmp to an Enumerable so that .NET performs the query instead of SQL.
var results = tmp.AsEnumerable().Select((row, index) => new { row.ContainerID, row.TypeID, ContainerIndex = index });
0 голосов
/ 14 января 2014

Мне пришлось сделать это раньше сегодня (но с использованием нескольких столбцов - еще сложнее). LINQ определенно не работал для меня, особенно с динамическим числом передаваемых индексов.

Возможно, вам больше повезет, если вы потянете свои объекты в List<T> и затем примените к ним метод .Sort Вот грязный пример, которым вы можете руководствоваться.

var query = db.MyTable.Where(x => something);
var list = query.ToList();
list.Sort((x, y) => {
    // decide how you want to compare
    // use string.compare or another method
    // return -1, 0, 1 as is normal for sorting

    return 0; //Replace this
});
...