2015-02-19 2 views
3

Наличие:Как добавить заказ (автоинкремент) в коллекцию с помощью Linq?

Инициализировать коллекцию Anonymouse (я бы отправить его в формате JSON)

var myCollection = new[] 
{ 
    new 
    { 
     Code = 0, 
     Name = "", 
     OtherAttribute = "" 
    } 

}.ToList(); 

myCollection.Clear(); 

И получить данные.

myCollection = (from iPeople in ctx.Person 
       join iAnotherTable in ctx.OtherTable 
       on iPeople.Fk equals iAnotherTable.FK 
       ... 
       order by iPeople.Name ascending 
       select new 
       { 
        Code = iPeople.Code, 
        Name = iPeople.Name, 
        OtherAttribute = iAnotherTable.OtherAtribute 
       }).ToList(); 

Я хочу добавить столбец Identity, мне нужна упорядоченная коллекция и счет от 1 до collection.count. Для привязки этого счетчика к столбцу в таблице (jtable).

var myCollection = new[] 
{ 
    new 
    { 
     Identity = 0, 
     Code = 0, 
     Name = "", 
     OtherAttribute = "" 
    } 

}.ToList(); 

myCollection = (from iPeople in ctx.Person 
       join iAnotherTable in ctx.OtherTable 
       on iPeople.Fk equals iAnotherTable.FK 
       ... 
       order by iPeople.Name ascending 
       select new 
       { 
        Identity = Enum.Range(1 to n)//Here I don´t know how to do; in pl/sql would be rownum, but in Linq to SQL how? 
        Code = iPeople.Code, 
        Name = iPeople.Name, 
        OtherAttribute = iAnotherTable.OtherAtribute 
       }).ToList(); 
+1

Возможно, вы можете переусердствовать. Есть ли что-нибудь, что мешает вам использовать локальную переменную счетчика, чтобы установить личность? Например: 'Identity = counter ++'? –

+0

@SimonWhitehead Ничего, но я не хочу снова повторять весь список после его получения. Если я могу это сделать с помощью Linq, будет здорово. –

+0

Вам не нужно повторять итерацию .. вы можете сделать это в запросе LINQ - как я продемонстрировал в своем последнем комментарии. –

ответ

0

Как заявил Саймон в своих комментариях, рассмотрим следующий, хотя и надуманный, например:

int i = 0; 
var collection = Enumerable.Range(0, 10).Select(x => new { Id = ++i }); 
+0

Почему тогда не просто 'Select (x => new {Id = x});'? –

+0

@Roy, идея заключалась в том, чтобы использовать внешний счет 'i', который может быть увеличен' i ++ 'в' Select() '. Конечно, вы могли бы просто использовать 'x' в моем примере, но исходная коллекция OP не является конструкцией« Enumerable.Range ». Вот почему я сказал, что это надуманный пример :) – Didaxis

1

Как Симон предложить в комментариях, которые могли бы выглядеть, как показано ниже:

int counter = 0; //or 1. 
myCollection = (from iPeople in ctx.Person 
      join iAnotherTable in ctx.OtherTable 
      on iPeople.Fk equals iAnotherTable.FK 
      ... 
      order by iPeople.Name ascending 
      select new 
      { 
       Identity = counter++, 
       Code = iPeople.Code, 
       Name = iPeople.Name, 
       OtherAttribute = iAnotherTable.OtherAtribute 
      }).ToList(); 

Есть ли какие-либо проблемы при выполнении этого кода?

+0

yes it throws me 'Дерево выражений может не содержать оператор присваивания' –

5

Если вы используете linq для объектов или linq для sql, получите свои данные с сервера и ToList(). Скорее всего, этот ответ не переведёт на sql, но я его не пробовал.

List<string> myCollection = new List<string>(); 
myCollection.Add("hello"); 
myCollection.Add("world"); 
var result = myCollection.Select((s, i) => new { Identity = i, Value = s }).ToList();