1

こんにちは私はEntity Framework newbです。次のコードをデータ関係の単一のクエリに取得しようとしています。関係は1対多です。動作しませんLINQ to Entity Relationship

コード:

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryTypeID == getCategoryTypeID(selectedId)); 

int getCategoryTypeID(int selectedTypeId) 
{ 
    return db.DataModel.CategoryLinkTypes.Where(l => l.ID == selectedTypeId) 
     .FirstOrDefault().ToInt(0); 
} 

は、私はあなたが私がやろうとしていますかを見ることができると思います。このコードを実行すると、次のエラーが表示されます。

LINQ to Entities does not recognize the method 'Int32 getCategoryTypeID(Int32)' method, and this method cannot be translated into a store expression.

誰かが私にこれを行う正しい方法を教えてもらえますか?

私は、あなたはまだ、クエリでそのような関数を呼び出すことはできませんEF 4 +とC#

答えて

0

あなたは、リンククエリのうち、あなたの関数を引っ張って試すことができます:

int categoryTypeId = getCategoryTypeID(selectedId); 

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryTypeID == categoryTypeId); 
+0

これはあなたのために働いてうれしいです。好奇心の外に、あなたは一緒に行きましたか? –

+0

私は2番目のオプションを使用しました。なぜなら、私の関係で扱うオブジェクトが2つ以上あったからです。だから、それはただ一つのテーブルに過ぎませんでした。ご協力いただきありがとうございます! – Jared

+0

意味があります - 最初のオプションは実際には欠陥がありました。 IEnumerable >が返されます。私はそれを明確にするために削除するつもりです。 –

0

を使用しています。しかし、関数内のロジックを抽出し、それを式にしてクエリ内で使用することができるはずです。希望、それは明らかです。

+0

こんにちは、次のように? var categories = db.DataModel.Categories.Where(c => c.CategoryTypeID == db.DataModel.CategoryLinkTypes.Where(l => l.ID == selectedTypeId).FirstOrDefault()。ToInt(0)); – Jared

0

基本的に、このエラーはgetCategoryTypeIDをSQLステートメント(または使用している永続レイヤー)に変換できないということです。あなたのコードでこれは理にかなっていますが、このコードはクエリーに変換され、コンパイラーがそのクエリーを関数から外す方法がわからなければ、何も戻せません。

オプションは、JOINの2つのテーブルになり、CategoryLinkTypesに対して直接どこで実行しますか。

別のオプションはQueryableを返すために、あなたの機能を変更することですが、私はJOIN、この場合には、JOINの

例(私はこれが動作するはずと信じて:))単純かもしれないと思う:

db.DataModel.Categories 
    .Join(
     db.DataModel.CategoryLinkTypes, //What you are joining 
     category=>category.CategoryTypeID, //Right Side 
     categoryLinkType=>categoryLinkType.CategoryTypeID, //Left Side 
     (category, categoryLinkType) => //Creation of new, combined object 
      new{LinkTypeId = categoryLinkType.Id, 
       Category = category} 
    ) 
    .Where(x=>x.LinkTypeId == selectedId) 
    .Select(x=>x.Category); //We only want the Category 
+0

JOINの例を教えてもらえますか? .Include( "X")を使用していますか? – Jared

+0

インクルードは、遅延読み込みをオーバーライドするためのものです。 Joinは、バックエンドでクエリを作成するために使用されるものです。私は私の例を更新しました –

0

データベースを外部キーで適切にセットアップしてから、ナビゲーションプロパティを生成したとします。 (私はちょうど推測している、あなたの実際のデータモデルを見ることができないので、あなたのアイデアを取得する必要があります)あなたはこのような何かを行うことができる必要があり、あなたがあなたの質問を編集した場合

var categories = db.DataModel.Categories 
    .Where(c => c.CategoryType.CategoryLinkTypeID == SelectedTypeID); 

と含まCategoryとCategoryTypeエンティティの定義を参考にしてください。

関連する問題