2014-01-23 36 views
2

讓我們假設我在C#中執行以下查詢使用指數作爲LINQ查詢一個額外的ID

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

好吧,我得到的結果我的模型SchoolTestsPerModulePerStudent的所有記錄。 但是,是否有可能在執行查詢時添加新的標識?

這意味着,如果我的模型有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

你需要它作爲一個字符串例如,或者你需要它來執行數據庫查詢? – Vinicius

+0

您的示例數據有5個字段。或者是第一個主鍵/唯一標識符? –

+1

@GrantWinney我相信第一列是他想添加的那一列......新編號 – Vinicius

回答

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

+1我不知道!感謝分享..這種方法唯一的缺點是它會使它很難用作ViewModel(使用匿名類型),但概念在那裏,很乾淨.. – Nico

+0

嗯......這似乎真的很好。我會盡量使用它。 +1爲您的答案。 –

+0

不應該是'Id = i + 1'嗎?看起來好像OP想要一個基於索引的索引。 – ekad

1

如果您使用.ToList()將查詢轉換爲列表,則可以使用query.IndexOf()獲取列表中項目的基於0的索引。

+0

非常感謝安德魯。從我+1 +1 –

1

您是否試圖只爲您的課程添加一個額外的屬性以返回到您的模型?如果您需要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()方法,同時列舉了一組更快,只是做在你的看法。

+0

非常感謝Nico。我剛剛投票。 –

1

我認爲你可以使用選擇()。

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

+0

非常感謝陳。從我+1 –

相關問題