質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

6827閲覧

LINQでのJOINの使い方について

DinKa

総合スコア40

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2016/04/12 05:04

編集2016/04/12 11:02

いつもお世話になっています。
今回は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データやソースも作成します。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tak1wa

2016/04/12 07:49

補足の要求ではなく、EF含めいくつかの無関係な依存クラスが含まれていますのでそういったものを除去して最小限のコードをアップしなおしてください。不透明です。
DinKa

2016/04/12 08:44

不要と思われるクラスを削減してみました
guest

回答1

0

自己解決

今回はJOIN以外を使用して対応できましたので、解決自体はしました。

また、読みに来ていただいた皆様申し訳ありません、おそらく私の質問の内容に問題があるではないかと思います。
今後は質問力を高め解決策を回答しやすく、また後発の方にもわかりやすいような質問をするように心がけます。

投稿2016/04/14 09:46

DinKa

総合スコア40

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問