2010-05-24 41 views
0

我需要做這樣的事情,相同的LINQ的兩個表

我的兩個表具有相同的簽名,但不同的類,所以它想工作,但它不工作。

var myTable; 

if (booleanVariable == true) 
{ 
    myTable = table1; 
} 
else 
{ 
    myTable = table2; 
} 


var myLinq1 = from p in myTable 
      join r in myOtherTable 
      select p; 

在這種情況下,我必須初始化爲myTable

我也試過,

var myTable= table2; 

if (booleanVariable == true) 
{ 
    myTable = table1; 
} 

var myLinq1 = from p in myTable 
      join r in myOtherTable 
      select p; 

則var爲類型表2,那麼它不能被更改爲table1的類型。

我需要幫助,我不想複製所有代碼的粘貼。 linq查詢是巨大的,它嵌套5或6個查詢。我也必須在12種不同的方法上做到這一點。

非常感謝您的幫助。

+0

現在對不起,我不得不說,但我認爲這是一個醜陋,醜陋,醜陋的SQL設計。如果你有兩個「相同簽名」的表(我認爲這意味着相同的列),那麼只需要有一個鑑別器列,而不是兩個表。 – 2010-05-24 05:39:05

+0

他們來自一個非常不同的來源,所以我最好把它放在另一張桌子上。可能你用這麼少的信息就無法理解,但相信我,我只用一張桌子就完成了,而且它沒有奏效。我的疑問非常大。所以我改變了設計,併爲最終結果工作。但我有麻煩插入數據。數據是完全一樣的,但它有一個非常不同的含義。感謝評論,但我已經嘗試過 – 2010-05-24 05:52:17

+0

你是完全正確的。我有一個錯誤,感謝喬恩,我必須改變一點點我的計劃,但它是值得的。 – 2010-05-24 06:40:59

回答

0

不知道這是否會工作,從來沒有嘗試過,但是...

如果這兩個類可以實現相同的接口或共享一個基礎類,你可以做也許:

var q = (booleanVariable) 
    ? from p in myTable1 select (ISomeInterface)p 
    : from p in myTable2 select (ISomeInterface)p; 

如果你經常使用它,你可以把它放到它自己的方法中 - 我相信它會返回IQueryable <ISomeInterface>。

然後使用LINQ方法而不是LINQ C#語法(即OrderBy()而不是orderby)連接到LINQ查詢的其餘部分。我只是不知道LINQ-to-SQL是否足夠聰明,可以將其轉換爲正確的SQL查詢。

但我同意喬恩的評論 - 這可能是糟糕的設計,應該重新審視。如果你不能自己重組表,那麼你只需要讀取訪問權限,那麼如何將這兩個表結合在一起,然後將這個視圖綁定到LINQ-to-SQL結構中。

+0

這個項目說明日期,並且這些日期改變狀態。我必須找到國家改變的最後時刻。這讓我的疑問很糟糕,因爲最新的變化不一定是某個專欄的最新變化。我將嘗試你的方法,並重新考慮設計,當多個人認爲我必須檢查相同的時候。謝謝你的答案。 – 2010-05-24 06:00:08

+0

它爲第一個查詢工作,但在第二個嵌套查詢出現同樣的錯誤,沒有隱式轉換類型table1和類型表2 – 2010-05-24 06:12:45

+0

非常感謝喬,我正在改變我的SQL。我有一個錯誤,但我認爲我準時。 – 2010-05-24 06:41:49