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

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

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

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

Q&A

解決済

1回答

2961閲覧

LINQ クエリ構文とメソッド構文でできることの違いについて

abd1106

総合スコア12

LINQ

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

0グッド

0クリップ

投稿2021/10/27 12:14

編集2021/10/27 12:17

タイトルの内容について質問があります。(答えていただきたい内容に丸数字を付けています)

①LINQのメソッド構文でできるものの、クエリ構文ではできないことがあるという情報をインターネットで見つけましたが、具体的にできることは何が違うのでしょうか。

②拡張メソッドでカラムを選択して処理をしたい場合は、クエリ構文ではできず、メソッド構文では実現可という認識ですが、正しいのでしょうか。
※参考URL(拡張メソッド一覧):https://johobase.com/linq-method-list/

③OracleやSQL ServerといったSQLでは実現できるものの、LINQ(クエリ構文やメソッド構文)では、実現できないことはあるのでしょうか。

④例えば、複数カラム存在するテーブルから特定のカラムの最大を取得する場合、クエリ構文では実現できず、メソッド構文では実現できると考えておりますが、認識あっておりますでしょうか。
(Microsoftのドキュメントを見る限り、カラム指定をしてデータを合計するときは、メソッド構文を使用しているようです)
※参考URL:https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.max?view=net-5.0#code-try-5

■例:クエリ構文では取得不可能?だが、取得可能なメソッド構文のケース

LINQ

1using Microsoft.AspNetCore.Mvc; 2using QuickMaster.Models; 3using QuickMaster.Views; 4using System; 5using System.Collections.Generic; 6using System.Linq; 7using System.Web; 8using WebApplication1.Models; 9using System.IO; 10 11namespace WebApplication1.Controllers 12{ 13 public class HomeController : Controller 14 { 15 private readonly MyContext _context; 16 17 public HomeController(MyContext context) 18 { 19 this._context = context; 20 } 21 22 public ActionResult Index() 23 { 24 ItemList[] items = new ItemList[] { 25 new ItemList() { Id = 1, Price = 100, ExpiryDate = new DateTime(2000, 4, 1) }, 26 new ItemList() { Id = 2, Price = 200, ExpiryDate = new DateTime(2005, 5, 1) }, 27 new ItemList() { Id = 3, Price = 300, ExpiryDate = new DateTime(2010, 6, 1) }, 28 new ItemList() { Id = 4, Price = 400, ExpiryDate = new DateTime(2015, 7, 1) }, 29 new ItemList() { Id = 5, Price = 2020, ExpiryDate = new DateTime(2020, 8, 1) } 30 }; 31 32 var traders1 = from m in items select m; 33 var tmp1 = traders1.Max(x=>x.Price); 34 35 Console.WriteLine(tmp1); 36 37 return View(); 38 } 39 } 40}

環境は、.NetCore 3.1 でVisual Studioを使用しております。
※本当はコントローラに書くのは良くないということは分かっていますが、動作確認が容易だと判断してあえてここに記載しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

Linq の全てのクエリ構文はコンパイル時にメソッド構文に変換されます。
つまり、クエリ構文でできることは全てメソッド構文でできますが、メソッド構文に対応したクエリ構文は存在しない場合がある、ということです。
例えば Max に対応するクエリ構文は存在しません。

③ に関しては、Linq を SQL に変換するプロセスが挟まるので、Linq では書けない SQL というのはもちろん存在しています。

データベースへのクエリという文脈に限れば、
生 SQL > Linq メソッド構文 > Linq クエリ構文
の順で表現力が高いということです。

② は質問の内容がよく分かりませんが、クエリ構文で表現できないかどうかはクエリの内容によるので一律に答えることはできません。

投稿2021/10/28 01:47

tamoto

総合スコア4105

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

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

abd1106

2021/10/28 03:13

こんにちは。 お世話になります。 ご回答いただき、ありがとうございます。 ①そう考えると、クエリ構文だけでできることはかなり限定的ということでしょうか。(Maxなどの集計関数などは、基本メソッド構文なため) ③の回答内容、理解致しました。やはり、SQLの内容をLINQで完全再現はできないのですね。表現力の高さの比較、大変分かりやすくて、助かりました。ありがとうございました。 ②についてですが、例えば、以下のようなテーブルがあったと仮定すると、拡張メソッド(例えばMax)であれば、Max(x=>x.価格)といったように、最大値を取得したいカラムを指定することになると思います。AverageやSumを使う時も同様に、平均や合計を取得したいカラム名を取得したいカラムをAverageやSumのカッコ内の引数に指定することになると思います。ただ、クエリ構文では、最大値や合計、平均を取得する際に、カラム指定をする(Max(最大値を取得したいカラム名))という書き方ができないという認識でよろしいでしょうか?ということがお聞きしたく、質問をさせていただいた次第です。 この度のご回答で、クエリ構文では、そもそもMaxなどはないというご回答をいただきましたので、②についての疑問は解消されました。 | 商品 |価格|在庫| |りんご|100| 50 | |みかん|120| 80 | |ばなな| 50 |100| ※参考URL(再掲 拡張メソッド一覧):https://johobase.com/linq-method-list/ そうなると、メソッド構文だけで書くか、クエリ構文とメソッド構文を合わせて書くという形になりそうですね。
tamoto

2021/10/28 05:17

集計などの「結果」を求めるものは基本的にメソッド構文で書くようになっています。 クエリ構文はデータの集合を加工して得られる「シーケンス」を記述する場合にシンプルに表現できる別記法に過ぎません。 クエリ式は常に `IEnumerable<T>` を返すという点に注目してください。(注: 厳密ではない) クエリ式で表せるのは常に「データ列」であるということです。
abd1106

2021/10/28 05:28

ご回答いただき、ありがとうございます。 大変分かりやすかったです。 教えていただいた内容をもとに理解を深めます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問