Получить индекс в LinQ Lambda Join

1

Я совершенно новичок во всех материалах.Net и просто задаюсь вопросом о чем-то, что я хотел бы сделать. Я некоторое время использовал запросы LinQ Lambda для возврата значений списка с помощью оператора Select, например:

        var data = list.Select((x, i) =>
            new
            {
                Index = i,       // <--- this is what I need!
                Value = x.Value,
                Text = x.Text
            })
            .ToList();

Дело в том, что у меня есть выражение LinQ Lambda Join, как следует из:

        var data = DataBase.Table1
            .Join(DataBase.Table2,
                x => x.Id,
                y => y.Id,
                (x, y) => new    // <--- I can't do the same here :(
                {
                    Index = ???, // <--- Here is where I need the index!!
                    Value = x.Id,
                    Text = y.Description,
                })
            .OrderBy(x => x.Id)
            .ToList();

Мой вопрос: как я могу получить индекс в этом втором запросе linq, как это было в первом?

  • 0
    Вы уверены, что Linq to SQL может перевести Select с индексом на SQL? Я думаю, что ваш первый запрос не будет работать.
  • 0
    Правда, извините, первые операторы работают со списками объектов. Моя путаница заключается в том, что таблицы базы данных, которые я обычно использую, анализируются объектами EntityFramework. Я редактировал вопрос. Дело в том, что в конце концов все списки IEnumerable, поэтому я думаю, что должен быть подходящий способ сделать это!
Теги:
linq
lambda
linq-to-sql

1 ответ

1
Лучший ответ

Вы не можете использовать Select<T>(Func<T,int,bool>) с Linq to SQL. Вы увидите NotSupportedException, если вы попытаетесь выполнить свой первый запрос:

Неподдерживаемая перегрузка, используемая для оператора запроса "Выбрать",

Вы можете использовать этот оператор с Linq для объектов. Просто переместите выполнение запроса в память с помощью вызова AsEnumerable(). При втором запросе добавьте еще один прогноз после того, как вы получили результат соединения и переместили выполнение в память:

 var data = DataBase.Table1
            .Join(DataBase.Table2,
                t1 => t1.Id,
                t2 => t2.Id,
                (t1, t2) => new { Value = t1.Id, Text = t2.Description }
            )
            .AsEnumerable() //otherwise next operator cannot be translated to SQL
            .Select((x,i) => new { x.Value, x.Text, Index = i})
            .OrderBy(x => x.Value)
            .ToList();

UPDATE: если вы хотите индекс t2, вы можете использовать GroupJoin вместо Join:

 var data = DataBase.Table1
            .GroupJoin(DataBase.Table2,
                t1 => t1.Id,
                t2 => t2.Id,
                (t1, t2items) => new { Value = t1.Id, t2items }
            )
            .AsEnumerable() //otherwise next operator cannot be translated to SQL
            .SelectMany(x => x.t2items.Select((t2, i) => 
               new { x.Value, Text = t2.Description, Index = i}))
            .OrderBy(x => x.Value)
            .ToList();

Если вам нужны оба индекса, то переместите все соединение в память:

 var data = DataBase.Table1.AsEnumerable().Select((t1,i) => new { t1, i })
            .Join(DataBase.Table2.AsEnumerable().Select((t2,i) => new { t2, i }),
                  x1 => x1.t1.Id,
                  x2 => x2.t2.Id,
                  (x1, x2) => new { 
                      Value = x1.t1.Id, 
                      Text = x2.t2.Description,
                      Index1 = x1.i,
                      Index2 = x2.i
                  })
            .OrderBy(x => x.Value)
            .ToList();
  • 0
    Боюсь, ваш ответ не тот, который я ищу, мне нужен индекс внутри внутреннего выбора объединения. Я отредактировал свой вопрос.
  • 0
    Внутренний выбор соединения возвращает один элемент. У него нет никакого индекса. Пожалуйста, уточните, какой индекс вы хотите
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню