この質問への回答は、この別の質問を引き起こしました。クラスが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);