C# 在LinQ Lambda联接中检索索引
我对所有的.Net内容都很陌生,只是想知道一些我想做的事情。 一段时间以来,我一直在使用LinQ Lambda查询返回带有C# 在LinQ Lambda联接中检索索引,c#,.net,linq,linq-to-sql,lambda,C#,.net,Linq,Linq To Sql,Lambda,我对所有的.Net内容都很陌生,只是想知道一些我想做的事情。 一段时间以来,我一直在使用LinQ Lambda查询返回带有Select语句的列表值,如下所示: var data = list.Select((x, i) => new { Index = i, // <--- this is what I need! Value = x.Value
Select
语句的列表值,如下所示:
var data = list.Select((x, i) =>
new
{
Index = i, // <--- this is what I need!
Value = x.Value,
Text = x.Text
})
.ToList();
var数据=列表。选择((x,i)=>
新的
{
Index=i,//x.Id,
y=>y.Id,
(x,y)=>new/您不能将Select(Func)
与Linq to SQL一起使用。如果尝试执行第一个查询,您将看到NotSupportedException:
查询运算符“Select”使用了不支持的重载
您可以将此运算符与Linq to对象一起使用。只需使用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();
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();
更新:如果您想要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
.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();
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();
你确定Linq to SQL可以将索引为SQL的Select
转换为SQL吗?我想你的第一个查询不会工作。是的,很抱歉,第一个语句使用的是对象列表。我的困惑是,我通常使用的数据库表是由EntityFramework解析为对象的。我已经编辑了这个问题。问题是,最后所有的表都是IEnumerable列表,所以我认为一定有一个合适的方法来做!恐怕你的答案不是我想要的,我需要连接的内部选择中的索引。我编辑了我的问题。连接的内部选择返回单个项目。它没有任何索引。请澄清你想要的索引返回项目列表,那些与c匹配的项目内部联接的条件,如果它返回一个列表,它有一个索引。否。join
返回单个项对-每个集合中一个。它不返回项列表。您想要什么索引-来自Table1
的t1
索引或来自Table2
的t2
索引?