1

この質問への回答は、この別の質問を引き起こしました。クラスが2番目のクラスに複数回関連付けられている場合に、クエリでクラスの静的メンバーとしてLINQ式を使用する方法

変更する必要のある既存のASP.netMVC4サイトがあります。

このサイトのコアエンティティは、いくつかの異なる会社によって作成され、いくつかのカテゴリに分割された販売中のアイテムです。私の仕事は、各企業にグローバルカテゴリの独自のオプションのエイリアスを許可することです。データベースとモデルに2つのカテゴリを設定することは問題ありませんでした。アプリケーションに、新しいオプションのエイリアスが存在する場合はそれを使用させ、それ以外の場合はデフォルトでグローバルにすることで、最適なアプローチを見つけるのに苦労しています。

すべてのLINQクエリに合体ステートメントを追加することは明らかに機能しますが、このロジックが存在する必要がある場所は数十あり、避けられない変更が発生した場合に備えて、このロジックを1か所に保持することが望ましいでしょう。

次のコードは、モデルに合体を格納するための私の試みですが、これにより、「初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます。」エラーがLINQクエリの実行時にスローされます。LINQに適した別の方法で、同様のことをどのように実現できるかわかりません。

モデル:

public class Item
{
    [StringLength(10)]
    [Key]
    public String ItemId { get; set; }

    public String CompanyId { get; set; }

    public Int32 CategoryId { get; set; }

    [ForeignKey("CategoryId")]
    public virtual GlobalCategory GlobalCategory { get; set; }

    [ForeignKey("CompanyId, CategoryId")]
    public virtual CompanyCategory CompanyCategory { get; set; }

    public String PreferredCategoryName
    { 
        get{
            return (CompanyCategory.CategoryAlias == null || CompanyCategory.CategoryAlias == "") ? GlobalCategory.CategoryName : CompanyCategory.CategoryAlias;
        }
    }
}

コントローラーLINQの例:

       var categories = (from i in db.Items
                          where i.CompanyId == siteCompanyId
                          orderby i.PreferredCategoryName
                          select i.PreferredCategoryName).Distinct();

        var itemsInCategory = (from i in db.Items
                          where i.CompanyId == siteCompanyId
                          && i.PreferredCategoryName == categoryName
                          select i);
4

1 に答える 1

1

getPreferredCategoryName1つは、問題が発生していることをEFが変換する方法を知らない限り、クエリでコンパイル済み関数()を使用している場合です。

アイテム定義で次のことを試してください。

public static Expression<Func<Item,String>> PreferredCategoryName
{
    get
    {
        return i => (i.CompanyCategory.CategoryAlias == null || i.CompanyCategory.CategoryAlias == "") ? 
                     i.GlobalCategory.CategoryName : 
                     i.CompanyCategory.CategoryAlias;
    }
}

これは次のように使用されます。

var categories = db.Items.Where(i => i.CompanyID == siteCompanyId)
                         .OrderBy(Item.PreferredCategoryName)
                         .Select(Item.PreferredCategoryName)
                         .Distinct();

EFが解析できる一般的に利用可能なコンパイルされていない式ツリーがあるため、これは機能するはずです。

于 2012-11-30T12:11:42.693 に答える