2012-11-30 39 views
1

回答這個問題,就產生了這個其他問題:How to use LINQ expressions as static members of classes in queries when the class is related multiple times to a second class凝聚領域沒有得到「只有初始化,實體成員和實體導航屬性都支持」從LINQ

我有一個現有的ASP.net MVC 4網站,我需要修改。

本網站內的核心實體是待售物品,由幾家不同的公司創建並分爲幾類。我的任務是讓每個公司有自己的可選別名用於全局類別。獲取在數據庫和模型中設置的兩個類別是沒有問題的,這使得應用程序在存在時使用新的可選別名,並且默認爲全局,否則就是我努力尋找最佳方法的地方。

向每個LINQ查詢添加一個coalesce語句顯然是可行的,但有幾十個位置需要存在這種邏輯,最好是在不可避免的更改發生時將此邏輯保存在一個位置。

下面的代碼是我試圖存儲在模型中聚結,而這會導致「只有初始化,實體成員和實體導航屬性都支持。」執行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); 

回答

1

對於一個你正在使用的查詢編譯功能(getPreferredCategoryName),除非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然後解析。

+0

我已經搞砸了這種方法,但無法弄清楚如何使它與查詢風格的LINQ語句一起工作,使用對象樣式的LINQ語句在你的例子中是缺少的一塊。謝謝。 – kscott

相關問題