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

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

新規登録して質問してみよう
ただいま回答率
85.48%
LINQ

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

2回答

3932閲覧

LINQで外部キーを辿ってデータ抽出したい

tauesan

総合スコア15

LINQ

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

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/04/26 03:00

編集2019/04/26 04:00

LINQで外部キーを辿ってデータ抽出したい

ASP.NET MVCでLINQを使用しています。
下記のようなテーブル構成の時にAccountID==1のUseDataを抽出したいときの、
LINQ構文(?)を教えてください。

VS 2017 Ver.15.9.8
MVCv5.2.3
.NET Framework Ver.4.7.03190
SQLServer (バージョンはどこで見るんでしょ?SSMSはv17.9.1)
EntityFrameworkv6.2.0

それぞれ、
List<Table_UseData> useData
List<Table_License> license
List<Table_Account> account
にデータが入っています。

var data = useData.Where(n => n.LisenceID == 1)
でLicenseID==1のデータが抽出できるのはわかりますが、
その更に外部のAccountIDでの抽出がしたいです。
できれば、Whereで。

テーブル

Table_UseData UseID PK LisenceID FK ~ Table_License LicenseID PK AccountID FK ~ Table_Account AccountID PK ~

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/04/26 03:43

開発環境(Visual Studio, MVC のバージョン、DB は何かとそのバージョン・エディション)を書いてください。 List<T> 型のオブジェクトはどのように作ったか書いてください。既存の DB のテーブルから ADO.NET Entity Data Model ウィザードで EDM を生成しその中に含まれるコンテキストクラスから作った? それ以外の方法?
tauesan

2019/04/26 04:01 編集

VS 2017 Ver.15.9.8 .NET Framework Ver.4.7.03190 SQLServer (バージョンはどこで見るんでしょ?SSMSはv17.9.1) 下記の部分はその通りです。 EntityFrameworkv6.2.0 Listの要素(?)はすべてint型です。 LINQ内の質問なので、環境については書きませんでした。 LINQ自体にはバージョンありませんよね??
guest

回答2

0

すでに解決済みになっていますが・・・

ASP.NET MVC での案を書いておきます。

既存の DB から ADO.NET Entity Data Model ウィザードを使って作った EDM に含まれるコンテキストクラスを使っているそうですが、であればわざわざそれから List<T> 型のオブジェクトを作る必要はなく、そのコンテキストクラスを直接使うべきと思います。

以下の画像は Microsoft が提供しているサンプルデータベース Northwind から EDM を生成したものです。

イメージ説明

以下のように読み替えれば質問者さんのケースと形は同じになると思います。

Oreder_Datails ⇒ Table_UseData
Products ⇒ Table_License
Suppliers ⇒ Table_Account

ProductID ⇒ LisenceID
SupplierID ⇒ AccountID

EDM に含まれるコンテキストクラスを使って以下のように JOIN して where 句で条件を付ければ望む結果が得られるはずです。

private NORTHWINDEntities db = new NORTHWINDEntities(); public ActionResult OrderDetails() { var model = from orderdatail in db.Order_Details join product in db.Products on orderdatail.ProductID equals product.ProductID join supplier in db.Suppliers on product.SupplierID equals supplier.SupplierID where supplier.SupplierID == 1 select orderdatail; return View(model); }

View に渡して表示すると以下の画像の通りとなります。

イメージ説明

【追記】

下のコメントに「List<T> 型からも同様に可能です。後で回答欄に追記しておきます」と書きましたがそれを以下に書きます。

上の回答のコードで、db.XXXXX に ToList メソッドを適用すれば List<T> 型のオブジェクトになりますが、List<T> 型のオブジェクトの場合でも全く同等な Linq 式が使えます。Linq to Entities か Linq to Objects かの違いがあるだけです。

質問者さんのケースでは他システムと連携して以下のように List<T> 型のオブジェクトを取得済みなのですよね。

List<Table_UseData> useData List<Table_License> license List<Table_Account> account

であれば、以下のようにして望む結果が得られるのではないかと思います。

var model = from u in useData join l in license on u.LisenceID equals l.LisenceID join a in account on l.AccountID equals a.AccountID where a.AccountID == 1 select u;

List<Table_UseData> からだけデータが得られれば良く、List<Table_License>、List<Table_Account> のデータは不要であればもっと単純に以下のようにしてもよさそうです。お試しください。

var model = from u in useData join l in license on u.LisenceID equals l.LisenceID where l.AccountID == 1 select u;

注:Linq to Entities と Linq to Objects の違いは以下の記事を見てください。どちらが良いかは適材適所ですが、ASP.NET MVC + EDM なら前者だと思います。

Linq to Entities / Objects
http://surferonwww.info/BlogEngine/post/2019/02/13/difference-in-linq-to-entities-and-objects.aspx

投稿2019/04/26 05:14

編集2019/04/26 07:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tauesan

2019/04/26 06:46

ありがとうございます。 EDMはほぼ触っていないので、そんな方法もあるのかと勉強になりました。 現在行っている開発では、他システムの連携の関係上、 List<T>形式での取得からのLINQの使い方。。が知りたかったのです。 ご回答ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/04/26 07:17

> 他システムの連携の関係上、List<T>形式での取得からのLINQの使い方。。が知りたかったのです。 そうであれば、List<T> 型からも同様に可能です。後で回答欄に追記しておきます。
tauesan

2019/04/26 08:15

かなり詳しいご説明ありがとうございました。 Linqの使い方がよくわかりました。 活用したいと思います。
guest

0

ベストアンサー

AccountID==1のUseData

これはAccountID == 1のLisenceのLisenceIDを持つuseDataって意味で合っていますかね?
条件が複雑になった場合は一つ一つの条件を達成できるLinqを別個に作って最後にそれを結合するのが簡単だと思います。

// AccountIDが1のlisenceのLisenceID(必ず存在する前提、複数ある場合は最初のもの) var lID = license.First(l => l.AccountID == 1).LisenceID; // LisenceIDが↑のlIDと一致するuseData useData.Where(u => u.LisenceID == lisenceID); // ↓ useData.Where(u => u.LisenceID == license.First(l => l.AccountID == 1).LisenceID); // Where増量版 useData.Where(u => u.LisenceID == license.Where(l => l.AccountID == 1).First().LisenceID); useData.Where(u => license.Where(l => l.LisenceID == u.LisenceID && l.AccountID == 1).Any())

投稿2019/04/26 04:20

moredeep

総合スコア1507

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

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

tauesan

2019/04/26 04:25

ありがとうございます。 そのwhere文の入れ子の方法が理解できていませんでした。 複数パターン用意いただき、理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問