假设我在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
我怎么能这样做?
答案 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