Я совершенно новичок во всех материалах.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, как это было в первом?
Вы не можете использовать 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();
Select
с индексом на SQL? Я думаю, что ваш первый запрос не будет работать.