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

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

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

LINQ to Entitiesは、言語統合クエリであるLINQをEDMに行う機能を指します。C#/VBといった言語に統合されており、Visual StudioのIntelliSense機能を始めとするコーディングの様々なサポートを受けることが可能です。

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

LINQ

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

Q&A

解決済

1回答

2668閲覧

DBからデータを取得時にSQLが構築されない

mmopop

総合スコア1

LINQ to Entities

LINQ to Entitiesは、言語統合クエリであるLINQをEDMに行う機能を指します。C#/VBといった言語に統合されており、Visual StudioのIntelliSense機能を始めとするコーディングの様々なサポートを受けることが可能です。

C#

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

LINQ

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

ASP.NET MVC Framework

ASP.NET MVC Frameworkは、MVCパターンをベースとした、マイクロソフトのウェブアプリケーション開発用のフレームワークです。

0グッド

0クリップ

投稿2021/01/19 07:25

編集2021/01/19 07:32

前提・実現したいこと

C#で一斉連絡ツールを作っています。
あらかじめ複数の質問を入れた定型文をいくつか作成しておき、選んでメールを送信し回答してもらうというものです。

発生している問題・エラーメッセージ

定型文を選択する画面で、LINQ to Entitiesを使用して親テーブルの定型文テーブルは作成日時の昇順、子テーブルの質問項目は項目番号順に並べてDBから取ってきたいのですが、エラーになります。

The entity or complex type 'safeApplication.Models.QTemplate' cannot be constructed in a LINQ to Entities query.

該当のソースコード

// 表示する定型文の一覧を作成日時の昇順でリスト List<QTemplate> template = (from qt in db.q_template join qti in db.q_template_item on qt.corporation_id equals qti.corporation_id into qtGroup where qt.corporation_id == corporation_id orderby qt.template_created ascending select new QTemplate { corporation_id = qt.corporation_id, template_id = qt.template_id, template_heading = qt.template_heading, template_subject = qt.template_subject, template_content = qt.template_content, template_created = qt.template_created, q_template_item = qt.q_template_item .OrderBy(t => t.confirmation_item_id) .Select(t => new QTemplateItem { corporation_id = t.corporation_id, template_id = t.template_id, confirmation_item_id = t.confirmation_item_id, required_item = t.required_item, question_sentence = t.question_sentence, option1 = t.option1, option2 = t.option2, option3 = t.option3, option4 = t.option4, option5 = t.option5, option6 = t.option6, option7 = t.option7, option8 = t.option8, option9 = t.option9 }).ToList() }).ToList();

試したこと

調べたところ、匿名型なら可能とあり、参考にしたサイトもvarを使用していたのでList<QTemplate> ではなくvarに変更して実行しましたが変わりませんでした。

template_created = qt.template_created,
から }).ToList() までを削除して実行してもエラーは変わりませんでした。

dbから親テーブルだけを取得し別の変数に入れて、in db.q_template の代わりに使用したところ、表示はうまくいきましたが、実施されたSQLを見てみると、ORDER BY confirmation_item_id でソートされていませんでした。

補足情報(FW/ツールのバージョンなど)

PostgreSQL
ASP.net MVC5
EntityFramework6.Npgsql

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/19 07:52

Linq to Entities は SQL 文に変換できないとダメなんすが、そういうことはありませんか? > dbから親テーブルだけを取得し別の変数に入れて、in db.q_template の代わりに使用したところ、表示はうまくいきましたが というところがなんか怪しい気がするのですが。(気がするだけで確証はないですが)
mmopop

2021/01/19 07:59 編集

>SQL 文に変換できないとダメ というのは、db.q_templateがSQL文に変換できないということでしょうか? 私の認識だと、db.q_templateというのは、条件を指定しないSELECT文だと思っていたのですが、これが違っていたということですか?
hihijiji

2021/01/19 08:07

エラーメッセージの通り、LINQ to Entities はプリミティブ型以外のほとんどの型は扱えません。 一度ToArray()するなどして、LINQ to Objectsが使えるIEnumerable<T>にする必要があります。
mmopop

2021/01/19 08:22 編集

ありがとうございます。 最後にToList()を使用しているので、今回の場合はこのままToList()でOKでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/19 08:51

> というのは、db.q_templateがSQL文に変換できないということでしょうか? 私の認識だと、db.q_templateというのは、条件を指定しないSELECT文だと思っていたのですが、これが違っていたということですか? あなたの質問に書いてある情報だけではそこは分かりません。なので、SQL 文に変換できないというのは想像です。でも、変換できなければダメなのは間違いないし、そこが怪しかったので、そのあたりを質問者さんの方で詳細に調べてはどうかと言ったつもりです。 SQL 文に変換できないとダメと言うのはどういうことかは以下の記事、そこからリンクが貼ってある CodeZine の記事を見てください。 Linq to Entities / Objects http://surferonwww.info/BlogEngine/post/2019/02/13/difference-in-linq-to-entities-and-objects.aspx
guest

回答1

0

自己解決

解決しました。
エラーの原因としては、db.q_templateがSQL文に変換できずエラーが出ていたようです。
なので、一度親と子テーブルをjoinした変数を作成し、コード中のjoin qti の文を消して変数からデータを取得するとうまくいきました。
ヒントをくれた方、ありがとうございました。

投稿2021/01/19 11:43

編集2021/01/20 00:08
mmopop

総合スコア1

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

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

退会済みユーザー

退会済みユーザー

2021/01/19 12:36

× 質問してくださった方 〇 ヒントをくれた方
mmopop

2021/01/20 00:09

申し訳ありません。 修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問