前回の質問ではお世話になりました。
C#歴半年&MVC勉強したてですが、質問させていただきます。
今回はエラーメッセージの解決方法がわからず、質問させていただきたいと思います。
###前提・実現したいこと
C#(ASP.NET Framework4.5.1 MVC)で履歴をExcel帳票出力するウェブアプリケーションを作っています。
コレクションに対してAddRangeを実装したいのですがうまく動きません。
###発生している問題・エラーメッセージ
エラー 1 'System.Linq.IOrderedQueryable<A.Models.TEAM_HIS>' に 'AddRange' の定義が含まれておらず、型 'System.Linq.IOrderedQueryable<A.Models.TEAM_HIS>' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています
###ソースコード
C#
1namespace A.Models 2{ 3 using System; 4 using System.Data.Entity; 5 using System.ComponentModel.DataAnnotations.Schema; 6 using System.Linq; 7 8 public partial class DefaultContext : DbContext 9 { 10 public DefaultContext() 11 : base("name=DefaultContext") 12 { 13 } 14 /// <summary> 15 /// プロジェクト経歴 16 /// </summary> 17 public virtual DbSet<TEAM_HIS> TEAM_HIS { get; set; } 18 /// <summary> 19 /// 変更履歴 20 /// </summary> 21 public virtual DbSet<CHANGE_HIS> CHANGE_HIS { get; set; } 22 } 23} 24 25namespace A.Models 26{ 27 using System; 28 using System.Collections.Generic; 29 using System.ComponentModel; 30 using System.ComponentModel.DataAnnotations; 31 using System.ComponentModel.DataAnnotations.Schema; 32 using System.Data.Entity.Spatial; 33 public partial class TEAM_HIS 34 { 35 [Key] 36 [Column(Order = 0)] 37 [StringLength(10)] 38 [DisplayName("team名")] 39 public string team { get; set; } 40 41 [Key] 42 [Column(Order = 1)] 43 [StringLength(10)] 44 [DisplayName("プロジェクト")] 45 public string project { get; set; } 46 47 [Key] 48 [Column(Order = 2)] 49 [DisplayName("開始日時")] 50 public DateTime start { get; set; } 51 52 [Key] 53 [Column(Order = 3)] 54 [DisplayName("終了日時")] 55 public DateTime end { get; set; } 56 } 57} 58 59 60 61using System; 62using System.Collections.Generic; 63using System.Linq; 64using System.text; 65using System.Threading.Tasks; 66using System.Web; 67using System.Web.Mvc; 68using System.Data.Entity; 69using A.Models; 70 71namespace A.Report.History 72{ 73 /// <summary> 74 /// 個人履歴(Excel)出力 75 /// </summary> 76 public class HistoryGenerator : BaseReportGenerator 77 { 78 /// <summary> 79 /// コンストラクタ 80 /// </summary> 81 public ReportGeneratorService(DbSet dbcontext) 82 : base(dbcontext) 83 {} 84 public void Set() 85 { 86 DateTime start = new DateTime(1900, 1, 1); 87 DateTime next = new DateTime(1900, 1, 1); 88 89 int i_c = 1; 90 // 対象を設定します(今回は仮にAAAとします) 91 var target = (from t in DbContext.CHANGE_HIS 92 where t.name == "AAA" 93 orderby t.date ascending 94 select t).FirstOrDefault(); 95 // CHANGE_HISの異動数を取得します 96 var m_c = (from m DbContext.CHANGE_HIS 97 where m.name == target.name 98 && m.eve != "out" 99 select m).Count(); 100 // outした対象のdateを取得します 101 var loss = (from l in DbContext.CHANGE_HIS 102 where l.name = target.name 103 && l.eve = "out" 104 orderby l.date ascending 105 select l.date).FirstOrDefault(); 106 // 履歴のコレクションで対象に異動がない場合の宣言 107 var col = from c in DbContext.TEAM_HIS 108 where c.team == target.team 109 orderby c.date, c.team ascending 110 select c; 111 // 一度データを消します 112 col = null; 113 114 115 // 履歴のコレクションを作成 116 foreach (var forlist in DbContext.TEAM_HIS) 117 { 118 start = (from s in DbContext.CHANGE_HIS 119 where s.team = forlist.team 120 && s.date >= start 121 orderby s.date, no ascending 122 select s.date).FirstOrDefault(); 123 if (m_c >= i_c) 124 { 125 next = (from n in DbContext.CHANGE_HIS 126 where n.team == forlist.team 127 && n.date >= start 128 orderby n.date, n.team ascending 129 select n.date).FirstOrDefault(); 130 }else{ 131 next = DateTime.Now; 132 } 133 134 // TEAM毎の個人履歴をセット 135 var addcol = from a in DbContext.TEAM_HIS 136 where a.team == forlist.team 137 && a.start < next 138 && a.start >= start 139 && a.start < loss 140 orderby a.start ascending 141 select a; 142 // 個人履歴に追加 143 addcol.AddRange(col); 144 ++i_c; 145 146 foreach (var his in col) 147 { 148 var hist = new History(target); 149 hist.Name = target.name; 150 hist.Team = his.team; 151 hist.Project = his.project; 152 hist.Start = his.start; 153 hist.End = his.end; 154 target.Histories.Add(hist); 155 } 156 target.ColStartPos = cols; 157 cols += target.OutputWidth() + 1; 158 } 159 } 160 } 161}
###補足情報
TEAM_HISというプロジェクトの履歴を管理しているテーブルから、CHANGE_HISという個人の異動経歴を管理しているテーブルを結合させて、個人ごとのproject履歴を表示したExcelを出力したいというのが、実現したい機能です。
ソースはその一部を表示させています。
注意しなくてはいけないのは、対象者(name)が、TEAMを移ることがあること、TEAMに所属している間にlossする(管理対象外になる)ことがあること。
以上を考慮したところ、対象者があるTEAMに所属していた期間、start, nextで取得し、その期間のproject履歴を抽出する。そして、それを異動回数(CHANGE_HISのレコード数-1)だけ繰り返し、コレクションに追加していく。ただし、CHANGE_HISのレコードにoutが出てきたら、その日付までとする。
このような観点でプログラムを作成しています。
ところが、AddRangeを使用すると、表記のエラーが出てしまい解決できませんでした。
エラー自体の意味が理解できていなく、可能でありましたらエラーの意味と解決方法を教えていただけますでしょうか。
よろしくお願いいたします。
###補足2
AddRangeをどう利用したいかですが、
C#
1// 1回目(本当はこれはaddcolではなく、colの形が望ましい) 2addcol = 3{ 4 {T1, P01, 2013-5-1, 2013-8-10}, 5 {T1, P02, 2013-8-21, 2013-12-20}, 6 {T1, P03, 2014-1-11, 2014-3-30} 7}; 8// 2回目(addcolは毎回上書きする) 9addcol = 10{ 11 {T2, P01, 2014-5-1, 2014-8-10}, 12 {T2, P08, 2014-8-21, 2015-3-30} 13}; 14// 3回目 15addcol = 16{ 17 {T3, P09, 2015-4-11, 2015-12-30} 18}; 19// 合算後(addcolを3回目まで足しこむ) 20col = 21{ 22 {T1, P01, 2013-5-1, 2013-8-10}, 23 {T1, P02, 2013-8-21, 2013-12-20}, 24 {T1, P03, 2014-1-11, 2014-3-30}, 25 {T2, P04, 2014-5-1, 2014-8-10}, 26 {T2, P08, 2014-8-21, 2015-3-30}, 27 {T3, P09, 2015-4-11, 2015-12-30} 28}; 29
上記のような2次元配列を足しこんでいくようにしていきたいです。
※2つのテーブルと出力結果をアップローダーにあげておきます。
リンク内容
回答4件
あなたの回答
tips
プレビュー