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

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

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

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

LINQ

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

Q&A

解決済

1回答

1491閲覧

LINQ 開発環境をVS2012からVS2019 引っ越し時、LINQ文でエラー「m_shain' の定数値を作成できません。」

Jack31

総合スコア10

C#

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

LINQ

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

0グッド

0クリップ

投稿2022/10/19 07:55

編集2022/10/20 04:14

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

[OS:WIN10][VS2012]で動いていたのを [OS:WIN10][VS2019]でビルドしなおすと実行時にLINQ文でエラーが出るようになってしましました。
エラー内容「System.NotSupportedException: '型 'MClip.DBModel.m_shain' の定数値を作成できません。このコンテキストでサポートされるのはプリミティブ型または列挙型だけです。'」
対象NETEntityFrameworkは4です。

該当のソースコード

C#

1 var srr = from a in ent.f_haishahyowariate 2 join b in ent.f_haishahyo 3 on a.HaishaHyoID equals b.ID 4 join c in ent.f_haishahyodetail 5 on a.ID equals c.HaishaWariateID 6 join d in ent.m_nonyusaki 7 on c.NonyusakiID equals d.ID 8 from e in ent.m_shain.Where(x => x.ID == a.UntenshuID).DefaultIfEmpty() 9 select new 10 { 11 idSyaryo =(a.SharyoID ?? 0), 12 Date = b.HaishaDate, 13 nameSei = e.ShainName, 14 nameMei = e.ShainRyaku, 15 destination = d.Yukisaki, 16 No = (c.GyoNo ?? 0) , 17 jikanshiteiID = c.JikanShiteiID 18 }; 19 var srs =(from a in srr 20 where a.idSyaryo == intSyaryoIDTemp 21 && a.Date.Contains(this._tenkoDate.Trim()) 22 && a.No == 1 23 orderby a.No ascending, a.jikanshiteiID ascending 24 select a).ToList();

イメージ説明

試したこと

前回の開発環境のPCは既にデータをすべて削除されているので
現在の開発環境PCにVS2012にインストールしてみたり
NUGETパッケージで現在インストール可能なうち一番古いNETEntityFramework4.1.103331をインストールしましたが結果は同じでした。
申し訳ありませんがご教授頂けるでしょうか。

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

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

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

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

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

Zuishin

2022/10/19 08:11

DefaultIfEmpty を除いてみるとどうなりますか? 念のために言いますが、正しく動くようになるとは言っていません。どのように変わるかを聞いています。
Jack31

2022/10/19 08:21

ご回答ありがとうございます。 from e in ent.m_shain.Where(x => x.ID == a.UntenshuID).DefaultIfEmpty() ↓ from e in ent.m_shain.Where(x => x.ID == a.UntenshuID) に変えてみましたが同じエラー文が出てきますね。。
Zuishin

2022/10/19 08:37

このコードは問題の起こるコードそのものですか? それともどこか書き換えていますか?
Jack31

2022/10/19 08:38

問題の起こるコードそのものです。
Zuishin

2022/10/19 08:44

他の例外ならともかく、その例外が起こるようには見えないんですが、新しいプロジェクトを作って同じ問題の発生する最小限のコードから成る実行可能なコンソールアプリを作ってみてください。 そうすればどこに問題があるのか切り分けることができるかもしれません。
Jack31

2022/10/19 08:52

ありがとうございます。やってみます。
退会済みユーザー

退会済みユーザー

2022/10/19 09:13

Linq to Entities なのか Linq to Objects なのかどっちですか?
退会済みユーザー

退会済みユーザー

2022/10/19 09:59 編集

こういう話ではないのですか? 質問のコードはそうはなってないようですが、違うものを提示しているとか? LINQでJOIN時のエラーについて http://bbs.wankuma.com/index.cgi?mode=al2&namber=90105&KLOG=155 ↓ この記事の 2 つ目の例 Linq to Entities / Objects http://surferonwww.info/BlogEngine/post/2019/02/13/difference-in-linq-to-entities-and-objects.aspx Linq to Entities と Linq to Objects を混ぜた結果では?
Jack31

2022/10/19 10:01

ご回答ありがとうございます。 Linq to Entities なのか Linq to Objectsの見分け方について調べてみたところ 確認できるWEBサイトは見つけられなかったのですが コードを見た感じLinq to Entitiesだと思います。 Linq to Entitiesについて調べてみたところ from e in ent.m_shain.Where(x => x.ID == a.UntenshuID).DefaultIfEmpty() がSQLに変換できていないのかもしれませんね。。 以前までいけたのに、できなくなったのは分からないですが。。
退会済みユーザー

退会済みユーザー

2022/10/19 10:11

いや、そうではなくて、問題が出るコードと違うものを提示しているとしか思えないです。そこをよく確認していただけませんか?
退会済みユーザー

退会済みユーザー

2022/10/20 01:47

自分の環境でですが、どのようにすると、 > System.NotSupportedException: '型 'MClip.DBModel.m_shain' の定数値を作成できません。このコンテキストでサポートされるのはプリミティブ型または列挙型だけです。 というエラーになるのかの例を回答欄に書いておきます。
Jack31

2022/10/20 02:20

ありがとうございます。お願いします。
guest

回答1

0

ベストアンサー

質問のコメント欄の 2022/10/20 10:47 の私のコメントで書いた件です。

自分の環境 VS2022, .NET Framework 4.8, EF6 でですが、どのようにすると、

System.NotSupportedException: '型 'MClip.DBModel.m_shain' の定数値を作成できません。このコンテキストでサポートされるのはプリミティブ型または列挙型だけです。

・・・というエラーになるのかの例を以下に書いておきます。質問者さんのコードでの問題の直接の回答ではないですが、ヒントになれば幸いです。

質問のコメント欄で紹介した以下の記事の 2 つ目の例を説明に使います。

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

コードを以下に抜粋します。

C#

1// これは Linq to Entities 2var delivery = 3 from d in context.Order_Details 4 group d by d.ProductID into g 5 orderby g.Key 6 select new 7 { 8 ItemCode = g.Key, 9 Count = g.Sum(x => x.Quantity), 10 SumAmount = g.Sum(x => x.UnitPrice * x.Quantity) 11 }; 12 13// これも Linq to Entities 14var test = from p in context.Products 15 join d in delivery 16 on p.ProductID equals d.ItemCode into dGroup 17 from item in dGroup.DefaultIfEmpty() 18 select new 19 { 20 ItemCode = p.ProductID, 21 Name = p.ProductName, 22 Count = item.Count, 23 SumAmount = item.SumAmount 24 }; 25 26// delivery を含めた test のコード全体を Linq to Entities と 27// して SQL に変換することができ、foreach で DB に SQL を投げ 28// ることができるので問題ない。 29foreach (var x in test) 30{ 31 Console.WriteLine( 32 $"Name: {x.Name}, Count: {x.Count}, Sum: {x.SumAmount}"); 33}

上のコードは、コメントにも書いてありますが、delivery を含めた test のコード全体を Linq to Entities として SQL に変換することができ、foreach で DB に SQL を投げることができるので問題なく期待する結果が得られます。

これを、以下のように、delivery に ToList メソッドを適用してから二つ目の Linq 式で使うと SQL 文に変換できないので、以下のエラーになります。

イメージ説明

一つ目の Linq 式で匿名クラスを使っていますので、エラーメッセージは「型 '匿名型' の定数値を・・・」となっています。匿名型でなく MClip.DBModel.m_shain クラスを定義して一つ目の Ling 式でそれを使うと、以下のように質問者さんのエラーメッセージと同じになります。

イメージ説明

質問に提示されているコードには上と同様なものはないので、問題が出るコードと違うものを提示しているのではないかと思った次第です。そのあたりを確認していただけませんか?

投稿2022/10/20 02:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Jack31

2022/10/20 04:15

大変丁寧なご回答ありがとうございます。 ただ発生している箇所は最初に乗せたコードで発生いるようです。。 キャプチャを追加しましたので確認して頂けるとありがたいです。
退会済みユーザー

退会済みユーザー

2022/10/20 05:46 編集

解決してないようですが、であれば、ベストアンサーは外した方がいいです。ベストアンサーがついていると見る人が減って、回答を得にくくなりますので。 上の回答は理解できたでしょうか? 上の回答から、エラーメッセージにある MClip.DBModel.m_shain というのが問題で、それがあるから SQL 文に変換できないのでエラーになっているのであろうと想像してますが、それ以上のことは質問の情報だけでは分かりません。質問者さんの方でそのあたりから追及してみてはいかがですか。 MClip.DBModel.m_shain というのは何なのか、それが Linq 文のどこでどのように使われているか、追いかけて調べてみてください。そこは、今の質問の情報だけでは回答者・閲覧者には分かりません。
Jack31

2022/10/20 06:04

承知しました。調べてみます。 現時点でベストアンサーをつけた覚えは無いですが、何かの拍子でうっかり付けてしまったようですね。。 ご指摘ありがとうございます。
Jack31

2022/10/20 09:16

少しエラー箇所を絞れましたので追記します。 Containsの中を定数にすると正常に動作しました。 ただ変数じゃないと画面で入力した値を渡せないので、現在も解決しておりません。 var srs =(from a in srr where a.idSyaryo == intSyaryoIDTemp && a.Date.Contains(”2022/10/22”) ← のように定数に変更したら上手くいきます。 && a.No == 1 orderby a.No ascending, a.jikanshiteiID ascending select a).ToList(); ------------------------------------------------------------- string bbb = "2022/10/22"; var srs =(from a in srr where a.idSyaryo == intSyaryoIDTemp && a.Date.Contains(bbb) ← これだとエラーが出てきます。 && a.No == 1 orderby a.No ascending, a.jikanshiteiID ascending select a).ToList();
退会済みユーザー

退会済みユーザー

2022/10/20 22:14 編集

それはどう考えてもあり得ない話で自分が想像できる範囲を越えてますね。質問の情報にないところにいろいろありそうな気がします。 試しに、最初の Linq 式の直後に以下の一行を追加したらどうなりますか? var srrList = srr.ToList(); そこでエラーが出なければ、それを使って、 var srs =(from a in srrList ... としてみたらどうなります?
Jack31

2022/10/21 00:24 編集

var srrList = srr.ToList();だとエラーが出ましたが 下記のように処理を分割したらいけました。 var srsB =(from a in srr where a.idSyaryo == intSyaryoIDTemp && a.No == 1 select a).ToList(); var srs = (from a in srsB where a.Date.Contains(this._tenkoDate.Trim()) orderby a.No ascending, a.jikanshiteiID ascending select a).ToList(); そもそもなぜソースコードを変更していないのに このようなエラーが発生するようになったのか分かりませんが、どうにか解決できました。 色々とご回答して頂き助かりました。ありがとうございますm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問