2012-05-09 53 views
6

我很好奇如何創建可以被LINQ翻譯的屬性。下面是一個非常簡單的例子。創建LINQ to Entities可以翻譯的屬性

我有一個表/類Category,具有柱ParentId鏈接到本身(因此,一個類別可以具有子類別)

EF自動生成一個屬性Category1,這是父類。

爲了清楚起見,我創建另一個屬性

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'在LINQ to Entities中不受支持。僅支持初始化程序,實體成員和實體導航屬性。

有沒有什麼辦法可以創建一個可翻譯的屬性(LINQ to SQL)而不用做.ToList()?

編輯:我想避免接觸Model.edmx因爲數據庫開發過程中經常變化和的.edmx往往需要在你的實體數據模型設計(.edmx文件)重新創建

+0

你需要創建一個導航屬性從類別到父母,如外鍵 –

+0

嗨冷告訴,抱歉,我不知道你的意思。已經有一個外鍵(否則EF不會創建Category1) – Aximili

+0

您是否真的在Model.Designer.cs和/或Reflector中查看'Category1'以查看添加到其定義中的屬性或其他工具? –

回答

2

如果你問是否有可能在getters/setters中使用任何C#代碼創建一個屬性,並且稍後它可以通過標準LINQ to Entities來理解 - 那麼不能這樣做。 C#比SQL更有表現力,期望Entity Framework充當一般的C#到SQL轉換器是不合理的。

但是,您可以解決這個問題的例子很多,請參閱Using a partial class property inside LINQ statement

更新

它會幫助,如果你告訴我們你想要什麼來實現的,但這裏有一個例子:

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。

+0

它不能在C#中完成?但是Model.Designer.cs本身(EDMX的CS文件)是C#,不是嗎?你是指從該鏈接返回表達式的屬性?我會看看它。 – Aximili

+0

是的,我指的是表達式屬性。它並不是使它在Model.Designer.cs中工作的屬性代碼,它是您用來訪問該屬性的表達式,例如''c => c.Category''。 EF知道你想要「Category」屬性並將其轉換爲「Category」列/表。 –

+0

對不起,我從來沒有使用表達式屬性。你是否可能將表達式屬性轉換爲SQL?你可以使用表達式屬性替換我的問題中的父屬性,以便LINQ可以翻譯它嗎?謝謝Jacek – Aximili

0

,您可以重命名Category1Parent

+0

這只是一個非常簡單的例子。我問的是如何編寫一個屬性,而不是重命名現有的屬性。不管怎麼說,還是要謝謝你。 – Aximili

0

你有4個選項:

  1. 使用代碼首先
  2. 將它添加到EDMX設計師
  3. 你的屬性添加到EDMX的CSDL部分,添加一列的的SSDL部分EDMX,然後在EDMX的映射部分將它們映射到彼此。
  4. 使用.ToList()將查詢帶入內存,然後使用內部LINQ而不是LINQ to Entities。