2010-09-24 70 views
0

我正在使用一個非常討厭但看不到變化的db。Linq:查詢從一個拆分列創建的「虛擬」列

我們有一個表,名爲 「位置」 與列, 「位置」

此列有一個像 「架子5」

這意味着 「情況A,保質5」 的價值觀。在理想的世界中,我會有一個Case和Shelf列,分別爲值「A」和5。

我想知道的是,如果有一種方法可以在我的實體類中定義一些「虛擬」(可能不是正確的詞)列,以便一旦我這樣做,我就可以查詢表這些列存在(選擇,Where子句,Group By等)?

不可否認,我對Linq很新,所以我甚至沒有用正確的技術術語來描述我想要做的事情。這使得難以找到答案。所以,如果有人只是想指向我的任何入門文檔,甚至可以幫助我開始,我會認爲這是一個有效的答案。

爲了使其更加複雜,該列僅按上述結構進行構建,具體取決於其他列的值,但我不會去那裏。

感謝您花時間閱讀本文。過去的經驗告訴我SO員工是最棒的!

回答

0

我已經習慣了凌到SQL,而不是LINQ到實體,但這應該工作

partial class Location 
{ 
    public string Case 
    { 
     get 
     { 
      int pos = Position.IndexOf(' '); 
      if (pos == -1) 
       throw new Exception(); 
      return Position.Substring(pos); 
     } 
    } 

} 
+0

這對於選擇非常適用:但是,當我嘗試在構造的Where子句中使用它(承認,使用方法來生成動態where子句,請在此處描述:http://stackoverflow.com/questions/3782305/linq- dynamic-query-contruction-query-moves-to-client-side) – donundeen 2010-09-24 21:13:16

+0

錯誤:成員'Case'不支持轉換爲SQL。 – donundeen 2010-09-24 21:13:44

+0

[對多個帖子抱歉,我一直打「返回」]。我是否也需要創建set方法,或者其他什麼? – donundeen 2010-09-24 21:14:22

0

任何你做給列分成實體框架內的多個其他列不將在您的查詢中轉換爲SQL。這意味着在派生列上進行的任何過濾都將在之後的客戶端上檢索未被其他where子句元素過濾的所有行。這可能不是什麼大問題,但這是你需要牢記的事情。

做一個計算列本身是在部分代碼文件中創建一個新屬性的簡單方法(如James Curran的回答所示)。即使在查詢中,您的對象也應該使用該屬性。

儘管如此,在您的情況下,我會考慮在數據庫級創建視圖。可以設置位置表的視圖,以將違規列分成兩個其他列而沒有太多困難,並且額外的開銷可以長期收益。你必須觀看你的更新,但對於大多數目的來說,這將符合你的目的。

+0

謝謝,可悲的是,我沒有那種數據庫訪問。而且我以前用原始SQL實現了這一點,所以我有點驚訝,我無法在這裏描述這個映射。 – donundeen 2010-09-24 21:15:53

+0

這個問題是否以任何方式與模型定義函數相關,如下所述:http://blogs.msdn.com/b/efdesign/archive/2009/01/07/model-defined-functions.aspx?因爲我想要的只是在轉換爲SQL時,列名稱是「SUBSTRING(Position,1,1)AS SHELF」而不是「SHELF」。我希望能夠在Column屬性上定義它(例如:[Column(Function =「SUBSTRING(CurUnitPosition,1,1)」)])。這似乎並不複雜,這就是爲什麼我不明白爲什麼我不能這樣做。這在C#4.0中可用嗎?謝謝! – donundeen 2010-09-28 20:14:03