2013-03-18 80 views
0

我正在嘗試將功能添加到我的搜索頁面。基本上,如果某個條件爲真(基於與另一個表的連接),則應用一些CSS類。這裏是我(簡化)型號:無法投射左連接

MyTable 
int Key 
string Someinfo1 
string Someinfo2 
string CssClass 

SomeTable 
int Key 
string CssClass 

使用LINQ,我想加入這兩個表,並指定SearchResult.CssClass = SomeTable.CssClass。實際上,這項任務有一些邏輯。

var test = db.MyTable 
    .GroupJoin(db.SomeTable, 
       m => m.Key, 
       s => s.Key, 
       (m, s) => new {m, s}) 
    .SelectMany(x => x.h.DefaultIfEmpty(), 
       (x, y) => new MyTable 
       { 
        Key = x.m.Key, 
        Someinfo1 = x.m.Someinfo1, 
        Someinfo2 = x.m.Someinfo2, 
        CssClass = y.CssClass 
       } 

此代碼中斷,給錯誤

The entity or complex type 'MyTable' cannot be constructed in a LINQ to Entities query.

如果我簡單地改變鑄造(x, y) => new MyTable創建一個匿名類型(x, y) => new那麼事情的工作我如何指望他們。儘管如此,我需要輸入MyTable才能與當前存在的視圖兼容。爲什麼它在嘗試投射時破裂,否則它工作正常?在事實之後投射也不起作用。在此先感謝

編輯:爲了澄清,MyTable映射到一個數據庫表,但CssClass的例外。我已經配置EF忽略元件

modelBuilder.Entity<MyTable>().Ignore(m => m.CssClass);

MyTable.CssClass期望值來自SomeTable

DefaultIfEmpty()被用於包括在MyTable所有條目。存在情況下,密鑰在MyTable存在,但不是SomeTable

+0

我在閱讀本文時遇到了一些麻煩。您是否打算在兩個表上進行組連接,然後將其重新映射到其中一個表的對象中?因爲你正在查詢'db.MyTable',然後選擇一個類型爲MyTable的對象。 – IronMan84 2013-03-18 17:46:03

+0

另外,什麼是'x.h.DefaultIfEmpty'? 'h'與它有什麼關係? – IronMan84 2013-03-18 17:47:06

+0

在問題的底部添加了一些信息。希望有幫助 – Jeff 2013-03-18 17:51:22

回答

1

就像錯誤說,你不能從一個查詢中創建一個實體的實例。

看起來你正試圖用屬性SomeTable覆蓋MyTable的屬性。該解決方案的一個缺點是如果實體被保存(這可能是你想要的,但它看起來不像你的使用),新的CssClass值將被保存回MyTable。如果您需要需要這樣做,您將不得不爲實體提供水合物(例如,使用ToList()),然後循環以使用來自相關實體的值更新值。

你最好的選擇可能是將要創建一個類型,它是實際的實體類的獨立您的視圖使用,而不是意見耦合到實體類。它增加了一些工作來映射兩個班級之間的關係,但您可以避免出現像您所面臨的問題。我可以在數據模型中看到一個挑戰 - 您如何知道CssClass值是否應該保存爲MyTableSomeTable

+0

我想這樣做是沒有意義的。懶惰再次讓我。我一直試圖找到一個解決方法來創建另一個ViewModel,這就是爲什麼我嘗試了'。忽略上面的垃圾。 – Jeff 2013-03-18 18:17:02

+0

不幸的是,只要你的存儲模型和我們的視圖模型有區別,最好不要嘗試和改變視圖中使用的存儲模型。 – 2013-03-18 18:36:58