いつもお世話になっています。
今回はLINQを勉強中でのエラーに関して質問させてください。
###前提・実現したいこと
LINQで2つのコレクションを連結させて、条件に基づいたコレクションを抽出し、一部の要素を抜だして、foreachで回して、AddRangeで次々に格納していきたい。
その中で、Join(join)を使用すると、エラーが発生し対処方法を教えていいただければと思います。
###発生している問題・エラーメッセージ
///クエリ式のエラー エラー 3 join 句のいずれかの式の型が正しくありません。'Join' の呼び出しで型を推論できませんでした。 ///ラムダ式のエラー エラー 1 メソッド 'System.Linq.Queryable.Join<TOuter,TInner,TKey, TResult>(System.Linq.IQueryable<TOuter>, System.Collections.Generic.IEnumerable<TInner>, System.Linq.Expressions.Expression<System.Func<TOuter,TKey>>, System.Linq.Expressions.Expression<System.Func<TInner,TKey>>, System.Linq.Expressions.Expression<System.Func<TOuter,TInner,TResult>>)' に対する型引数を使い方から推論することはできません。型引数を明示的に指定してください。 ↓にポイントしたときのエラーも記述します。 (拡張子)IQueryable<TResult> IQueryable<A_B_HIS>.Join<A_B_HIS,TInner,TKey, TResult>(IEnumerable<TInner>innner, System.Linq.Expressions.Expression<Func<A_B_HIS,TKey>>outerKeySelector, System.Linq.Expressions.Expression<Func<TInner,Tkey>>innerKeySelector, System.Linq.Expressions.Expression<Func<A_B_HIS,TInner,TResult>> resultSelector) (+3オーバーロード) 一致するキーに基づいて2つのシーケンスの要素を相互に関連付けます。キーの比較には既定の等価比較子が使用されます。 例外: System.ArgumentNullException
###該当のソースコード(一部を抜粋しています)
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel.DataAnnotations; 4using System.ComponentModel.DataAnnotations.Schema; 5using System.Data.Entity.Spatial; 6 7namespace A.Models 8{ 9 /// ABトラン 10 public partial class A_B_HIS 11 { 12 [Key] 13 [Column(Order = 0)] 14 [StringLength(10)] 15 public string from_id {get; set;} 16 17 [Key] 18 [Column(Order = 1)] 19 [StringLength(10)] 20 public string to_id {get; set;} 21 22 [Key] 23 [Column(Order = 2)] 24 [StringLength(10)] 25 public string from_no {get; set;} 26 27 [Key] 28 [Column(Order = 3)] 29 [StringLength(10)] 30 public string to_no {get; set;} 31 32 public DateTime? date {get; set;} 33 } 34} 35 36using System; 37using System.Collections.Generic; 38using System.Linq; 39using System.Text; 40using System.Threading.Tasks; 41using A.Models; 42using System.IO; 43using System.Diagnostics; 44 45namespace A.B.C 46{ 47 public class result 48 { 49 public string to_id { get; set: } 50 public string to_no { get; set; } 51 public string from_no { get; set; } 52 } 53 /// 対象のIDをとりあえずAAAとする 54 string select_id = "AAA"; 55 56 /// AAAとfrom_idを紐づける 57 var select_date = from sd in A_B_HIS 58 where sd.to_id = select_id; 59 orderby sd.date ascending 60 select sd; 61 62 /// AddRange用にList型クラスを作成する 63 List<result> result; 64 65 /// 選択されたIDのレコードの数だけ繰り返す 66 foreach (var target in select_date) 67 { 68 /// 選択されたIDと同じto_idを内部結合して、Noを抽出する(クエリ式) 69 List<result> add = (from a in A_B_HIS 70 join b in target 71 on new { id = a.to_id, no = a.to_no } 72 equals new { id = b.from_id, a = b.from_no } 73 where a.to_id == target.to_id 74 orderby a.to_no ascending 75 select new { a.to_id, a.to_no, target.from_no, }).FirstOrDefault(); 76 77 /// 選択されたIDと同じto_idを内部結合して、Noを抽出する(ラムダ式) 78 ///List<result> add = A_B_HIS 79 /// .Join(target, 80 /// (a) => new { Id = a.to_id, no = a.to_no }, 81 /// (b) => new { Id = b.from_id, no = b.from_no }, 82 /// (a, b) => a 83 /// )FirstOrDefault(); 84 result.AddRange(add); 85 } 86 } 87} 88
###試したこと
クエリ式しか書いたことがなかったため、エラーがわかりにくいかなと思って、ラムダ式で途中まで書いてみましたが、やはりエラーが発生します。ただ、エラー内容は違いますが、どちらも型の問題なのだと思います。しかし、なぜ同じテーブルのデータを使用しているのに型が問題になってしまうのかがわかりません。
###補足情報(言語/FW/ツール等のバージョンなど)
C# /.Net Framework4.5
Join句を使うために作ったソースなので、おかしなところがありましたらすみません。
補足として必要なら、他のDBデータやソースも作成します。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー