在linq查询中使用index作为额外id

时间:2014-01-23 03:26:52

标签: c# asp.net sql asp.net-mvc linq

假设我在C#

中执行以下查询
    var query = from b in db.SchoolTestsPerModulePerStudent
                where b.Student.Equals(2)
                select b;

好的,我得到了我的模型SchoolTestsPerModulePerStudent的所有记录。 但是,是否可以在执行查询时添加新的ID?

这意味着,如果我的模型有4个字段,StudentID,ModuleID,DateTest和GradeTest,则获取以下内容

1, 2, 3, 1 January 2013, 76

2, 2, 3, 5 January 2013, 79

3, 2, 4, 1 January 2013, 73

4, 2, 4, 7 January 2013, 71

我怎么能这样做?

4 个答案:

答案 0 :(得分:5)

Select的重载会为您提供索引:

var resultsWithId = query.Select((q, i) => new { Id = i, Student = q });

这会将结果放在一个匿名对象中。

编辑:正如Nico在下面提到的,这可能很难用作ViewModel。如果要将其用作那样,请创建一个可以保存信息的新定义类:

public class MyClass
{
    int Id;
    int StudentId;
    //etc
}

var resultsWithId = query.Select((q, i) => new MyClass { 
                                                 Id = i + 1, //one based index 
                                                 StudentId = q.StudentId 
                                                 //etc
                                               });

答案 1 :(得分:1)

如果使用.ToList()将查询转换为列表,则可以使用query.IndexOf()获取列表中项目的0索引。

答案 2 :(得分:1)

您是否只是想在课程中添加一个额外的属性才能返回到您的模型?如果您需要View的具体类结构,则需要使用此新属性创建新模型,因为匿名类型在视图模型中不会有用。

public class MyNewModel
{
    public int Id { get; set; }
    public long StudentID { get; set; }
    public long ModuleID { get; set; }
    public DateTime DateTest { get; set; }
    public int GradeTest { get; set; }
}

然后,您需要将您的原始查询转换为List()并选择设置值的新模型类型。

var query = (from b in db.SchoolTestsPerModulePerStudent
            where b.StudentID.Equals(2)
            select b).ToList();

var newResults = query.Select(x => new MyNewModel
{
    DateTest = x.TestDate,
    StudentID = x.StudentID,
    GradeTest = x.TestResult,
    ModuleID = x.ModuleID,
    Id = query.IndexOf(x)
});

通过将查询作为List传递给视图并在枚举集合时使用IndexOf()方法,在视图中执行此操作可能会更快。

答案 3 :(得分:1)

我认为你可以使用Select()。

source.Select(x=>new Model{newid=something,p1=x.p1,p2=x.p2....})

source.Select(x=>new{newid=something,x.p1,x.p2.....})

或者如果你想要newid是索引,你可以使用

source.Select((x,index)=>new{newid=index,x.p1,x.p2.....})

你可以在选择功能后做更多的linq