在Linq查询中获取行索引

时间:2019-02-17 15:39:59

标签: asp.net sql-server linq

我想从LINQ查询中获取结果集中行的索引。

int i = 0;
if (methodId == 4 || methodId == 7)
{
    sessions = db.sessions
        .Where(x => x.id == Id)
        .Select(x => new feeList
        {
            id = x.id,
            title = "Title: " + (i++)
        })
        .ToList();
}

我尝试添加一个i++,但是消息an expression tree may not contain an assignment operator出错。

如何将结果集中的行索引添加到我的title变量中。

1 个答案:

答案 0 :(得分:3)

(推荐版本)由于EF LINQ不支持An expression tree may not contain an assignment operator,因此必须使用ExecuteQuery + SQL row_number()函数。

sessions = db.ExecuteQuery<feeList>(@"
        select id,
            'Title: ' + convert(varchar(10),row_number() over (order by id)) title 
        from session where ID = {0}"
        , id).ToList();

(非推荐版本),或者如果数据很小并且不想使用sql,则可以使用ToList + select((object,index)=> YourLogic),因为ToList会将SQL发送到DB并将数据获取到内存系统将使用LINQ Object,因此它将支持assignment operator

sessions = db.sessions
    .Where(x => x.id == Id).ToList()
    .Select((x,i) => new feeList
    {
        id = x.id,
        title = $"Title: {i}"
    })
    .ToList();

PS,索引从0开始:

new[] {"obj1","obj2"}.Select((obj, index) => new {obj,index})

Result : 
objc    index
obj1    0
obj2    1