2010-07-20 3 views
3

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

Спасибо

+0

Он возвращает объект, для чего вам нужно заказать по столбцу индекс? – NetSide

+1

Что вы подразумеваете под индексом столбцов? Можете ли вы привести пример? – Steven

+0

У меня есть 4 столбца, где имена столбцов могут измениться в будущем. Например. Id, FName, LName, TelNo У меня есть таблица, в которой хранится список клиентов. Я хочу заказать первый столбец (Id), второй столбец (FName) и т. Д.Я не хочу ссылаться по имени, так как имя не всегда будет одинаковым. – 2010-07-20 11:56:26

ответ

4

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

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

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

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 к 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 в конце (нет необходимости в выборе). Вы хотите сначала прочитать главу о спецификациях C# о преобразовании выражений запроса, и вы должны иметь некоторый опыт с отражением и выражениями, если хотите сделать это в разумное время.

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

+0

Отличное объяснение. Мне нужно сделать некоторые чтения на деревьях выражений, чтобы начать с того, что я думаю. Кроме того, я понимаю, что делать дальше. Спасибо – 2010-07-20 15:48:37

+0

Все это хорошо, но это не относится к сценарию, где FirstName переименовывается в FName в базе данных. –

+0

Действительно, если вы хотите узнать об изменениях в схеме БД, вы должны спросить об обработке изменений в схеме БД. Но это не будет вопрос LINQ. vikp даже не спрашивал конкретно о LINQ to SQL, поэтому трудно решить эту проблему вообще. Мой лучший совет: если вы можете, создайте схему БД из своего кода, а не наоборот. Ручные изменения кода будут отражены в вашей всей базе кода, только что сгенерированный код сломает ее. Если вы не можете, подумайте об изменении схемы БД и классов сущностей вручную. Убегайте от ORM, которые требуют использования неадекватных инструментов. –

1

Я думаю, вы могли бы означать Select с индексаторами? Если да, то приведен пример из одного из моих запросов 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 }); 
2

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

1

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

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

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

+0

Исправьте меня, если я ошибаюсь, но в MS SQL мы можем заказать по индексу столбца, не так ли? Если это так, я бы подумал, что вы можете сделать то же самое в LINQ. – 2010-07-20 13:24:54

+0

LinqToSql - это абстракция. Таким образом, есть некоторые особенности мира данных, которые недоступны, потому что они не имеют смысла в объектном мире. У вас нет столбцов в объектном мире, поэтому упорядочение по индексу столбца не имеет смысла. –

0

Я должен был сделать это раньше сегодня (но используя несколько столбцов - еще сложнее). 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 
}); 
Смежные вопросы