6

LINQで変換できるプロパティを作成する方法に興味があります。以下は非常に簡単な例です。

Categoryそれ自体にリンクする列を持つテーブル/クラスがありParentIdます(したがって、カテゴリはサブカテゴリを持つことができます)

EFCategory1は、親カテゴリであるプロパティを自動的に生成します。

わかりやすくするために、別のプロパティを作成しました

public partial class Category
{
  public Category Parent
  {
    get { return Category1; }
  }
}

問題は、これが機能することです

var categs = ctx.Categories.Where(x => x.Category1 == null);

しかし、これは機能しません

var categs = ctx.Categories.Where(x => x.Parent == null);

指定されたタイプメンバー'Parent'は、LINQtoEntitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます。

.ToList()を実行せずに翻訳可能なプロパティ(LINQからSQL)を作成する方法はありますか?

編集:データベースは開発中に頻繁に変更され、.edmxを再作成する必要があることが多いため、Model.edmxには触れないようにします

4

3 に答える 3

2

ゲッター/セッターで任意のC#コードを使用してプロパティを作成し、後でそれを標準のLINQ to Entitiesで理解できるかどうかを尋ねた場合、それはできません。C#はSQLよりもはるかに表現力があり、Entity Frameworkが一般的なC#からSQLへのトランスレーターとして機能することを期待するのは無理です。

ただし、これは多くの場合に回避できます。例については、LINQステートメント内での部分クラスプロパティの使用を参照してください。

アップデート

何を達成したいのかを正確に教えていただければ助かりますが、例を次に示します。

public partial class Category
{
    public static Expression<Func<Category, bool>> ParentIsNullExpression
    {
        get 
        {
            return c => c.Category1 == null;
        }
    }
}

その後

var categs = ctx.Categories.Where(Category.ParentIsNullExpression);

式に対するあらゆる種類の操作が可能であり、それらの一部はEFによってサポートされているため、SQLに変換されます。

于 2012-05-09T08:43:29.103 に答える
0

Category1エンティティデータモデルデザイナ(.edmxファイル)で、名前をに変更できますParent

于 2012-05-09T03:48:03.900 に答える
0

4つのオプションがあります。

  1. 最初にコードを使用する
  2. EDMXデザイナーに追加します
  3. プロパティをEDMXのCSDLセクションに追加し、EDMXのSSDLセクションに列を追加してから、EDMXのマッピングセクションでそれらを相互にマップします。
  4. .ToList()を使用してクエリをメモリに取り込み、LINQtoEntitiesの代わりに内部LINQを使用します。
于 2012-05-09T08:54:29.850 に答える