[解決済み] メソッドをストア式に変換できない
質問
このコードはLINQ to SQLで動作するのを見ましたが、Entity Frameworkを使用すると、このエラーがスローされます。
LINQ to Entities は 'System.Linq.IQueryable'1[MyProject.Models.CommunityFeatures] GetCommunityFeatures()' メソッドを認識せず、このメソッドはストア式に変換できません`。
リポジトリコードはこれです。
public IQueryable<Models.Estate> GetEstates()
{
return from e in entity.Estates
let AllCommFeat = GetCommunityFeatures()
let AllHomeFeat = GetHomeFeatures()
select new Models.Estate
{
EstateId = e.EstateId,
AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
};
}
public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
return from f in entity.CommunityFeatures
select new CommunityFeatures
{
Name = f.CommunityFeature1,
CommunityFeatureId = f.CommunityFeatureId
};
}
public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
return from f in entity.HomeFeatures
select new HomeFeatures()
{
Name = f.HomeFeature1,
HomeFeatureId = f.HomeFeatureId
};
}
LazyList は IQueryable の機能を拡張したリストです。
なぜこのエラーが発生するのか、どなたか説明していただけませんか?
どのように解決するのですか?
理由は?
設計上
LINQ to Entities
では、LINQ のクエリ式全体がサーバーのクエリに変換される必要があります。クエリが翻訳される前に、いくつかの関連性のない部分式 (クエリ内の式でサーバーからの結果に依存しないもの) のみがクライアントで評価されます。この場合の GetHomeFeatures() のような、既知の翻訳を持たない任意のメソッド呼び出しはサポートされていません。
より具体的に言うと、LINQ to Entitiesは以下のものだけをサポートします。
パラメータレスコンストラクタ
と
イニシャライザ
.
解答です。
したがって、この例外を克服するためには、サブクエリをメインクエリにマージする必要があります。
GetCommunityFeatures()
と
GetHomeFeatures()
のように、LINQクエリ内から直接メソッドを呼び出すのではなく、LINQクエリからメソッドを呼び出します。また、新しいインスタンスをインスタンス化しようとした行に問題があります。
LazyList
の新しいインスタンスをインスタンス化しようとしている行の問題です。
LINQ to SQL
. そのための解決策は、LINQ クエリのクライアント評価 (LINQ to Objects) に切り替えることです。これには
AsEnumerable
メソッドを使用して、LazyList コンストラクタを呼び出す前に、LINQ to Entities クエリで使用することができます。
このようなものが動作するはずです。
public IQueryable<Models.Estate> GetEstates()
{
return from e in entity.Estates.AsEnumerable()
let AllCommFeat = from f in entity.CommunityFeatures
select new CommunityFeatures {
Name = f.CommunityFeature1,
CommunityFeatureId = f.CommunityFeatureId
},
let AllHomeFeat = from f in entity.HomeFeatures
select new HomeFeatures() {
Name = f.HomeFeature1,
HomeFeatureId = f.HomeFeatureId
},
select new Models.Estate {
EstateId = e.EstateId,
AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
};
}
もっと詳しく
をご覧ください。
LINQ to Entities、何がサポートされていないのですか?
をご覧ください。
また、以下をチェックしてください。
LINQ to Entities、サポートされないものの回避方法
にて、可能な解決策について詳しく説明しています。
(どちらのリンクも、オリジナルの Web サイトがダウンしているため、キャッシュされたバージョンです)
関連
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み] LINQ to Entities クエリでエンティティを構築できません。
-
[解決済み] LINQ to Entitiesはメソッドを認識しません。
-
[解決済み] [Solved] ASP.NET MVC 5 - Identity. 現在のApplicationUserを取得する方法
-
[解決済み] LINQ式におけるString.IsNullOrWhiteSpaceについて
-
[解決済み] LINQ to Entities は 'System.String ToString()' メソッドを認識せず、このメソッドはストア式に変換できない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】FluentとQuery Expression - どちらか一方にメリットがあるのでしょうか?