【问题标题】:Use index as an extra id in linq query在 linq 查询中使用索引作为额外的 id
【发布时间】:2014-02-13 10:39:47
【问题描述】:

假设我在 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

我该怎么做?

【问题讨论】:

  • 你需要它作为一个字符串,或者你需要它来对数据库执行查询?
  • @GrantWinney 我相信第一列是他想要添加的...新的 id
  • 大家好。非常感谢您的 cmets。基本上,我想使用 javascript (graphael chart) 创建一个图表。但是那个特定的库不接受日期作为数据点。所以我要做的不是将 (Date,Grade) 作为一个点传递,而是传递 (id,Grade)...
  • 是的,第一列是 id...

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


【解决方案1】:

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 我不知道!感谢分享.. 这种方法的唯一缺点是它很难用作 ViewModel(带有匿名类型),但是这个概念就在那里而且很干净..
  • 嗯...这看起来真的很好。我会尝试使用它。为您的回答 +1。
  • 不应该是Id = i + 1吗?看起来 OP 想要一个基于一个的索引。
  • @ekad 你是对的,如果他想要一个基于 1 的索引,那么它应该是 i + 1。谢谢!
  • 也被选为最佳答案。谢谢! :)
【解决方案2】:

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

【讨论】:

  • 非常感谢安德鲁。来自我的 +1
【解决方案3】:

您是否只是想为您的类添加一个额外的属性以返回到您的模型?如果您的 View 需要具体的类结构,则需要使用此新属性创建一个新模型,因为匿名类型在 View Model 中没有用处。

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)
});

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

【讨论】:

    【解决方案4】:

    我认为你可以使用 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

    【讨论】:

    • 非常感谢 chenZ。来自我的 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多