2011-03-15 64 views
0

考慮:LINQ to SQL:如何實現最少或類似的功能?

命名TABLE_1與下列的表:

  • ID
  • ColumnA
  • ColumnB
  • ColumnC
  • ColumnD

我有SQL查詢,其中TABLE_1根據ColumnA,ColumnB,ColumnC加入本身兩次。該查詢可能是這個樣子:

Select t1.ID, t2.ID, t3.ID, LEAST(t1.ColumnD, t2.ColumnD, t3.ColumnD) 
    From TABLE_1 t1 
    Left Join TABLE_1 t2 On 
     t1.ColumnA = t2.ColumnA 
    And t1.ColumnB = t2.ColumnB 
    And t1.ColumnC = t2.ColumnC 
    Left Join TABLE_1 t3 On 
     t2.ColumnA = t3.ColumnA 
    And t2.ColumnB = t3.ColumnB 
    And t2.ColumnC = t3.ColumnC 

問題:

我需要查詢的LINQ被重寫。我嘗試了一下:

var query = 
    from t1 in myTABLE1List // List<TABLE_1> 
    join t2 in myTABLE1List 
     on new {t1.ColumnA, t1.ColumnB, t2.ColumnC} 
    equals new {t2.ColumnA, t2.ColumnB, t2.ColumnC} 
    join t3 in myTABLE1List 
     on new {t2.ColumnA, t2.ColumnB, t2.ColumnC} 
    equals new {t3.ColumnA, t3.ColumnB, t3.ColumnC} 
    select new { 
    ID_1 = s1.ID, 
    ID_2 = s2.ID, 
    ID_3 = s3.ID, 
    // Invalid anonymous type member declarator. 
    // Anonymous type members must be declared with a member assignment, 
    // simple name or member access. 
    // how can I implement this? 
    least(s1.ColumnD, s2.ColumnD, s3.ColumnD) 
    }; 

.... 

private object least(params object[] objects) 
{ 
    // code here that sorts the objects and returns the 'smallest' of them. 

    return leastObject; 
} 

如何在LINQ中編寫我的查詢?我究竟做錯了什麼?我認爲可以在LINQ表達式中使用函數,那麼爲什麼我會得到這個錯誤?

+0

什麼LEAST(... )?你的環境中是否有一些自定義的UDF? – 2011-03-15 19:52:55

+0

我還應該注意到這些是字符串值(它們是一個varchar列中的數字,爲什麼這個列不是你說的一個整數?好問題......老闆不希望它是一個整數,以防我們得到來自我們客戶的非數字數據......可能會發生。) – DJTripleThreat 2011-03-15 19:55:48

+0

@K Ivanov,至少從Oracle它的Math.Min或調用MIN(列),除了它找到記錄中多列的最小值,而不是一列中有多個記錄。 – DJTripleThreat 2011-03-15 19:57:02

回答

1

我可能是錯的,但我認爲需要的least結果分配到新的匿名類型實例的實際成員,如:

select new { 
    ID_1 = s1.ID, 
    ID_2 = s2.ID, 
    ID_3 = s3.ID, 
    Least = least(s1.ColumnD, s2.ColumnD, s3.ColumnD) 
}; 
+0

我認爲這可能會做它的好友! :d – DJTripleThreat 2011-03-15 19:58:28

1

怎麼樣?

MinOfColumnD = Math.Min(Math.Min(s1.ColumnD, s2.ColumnD), s3.ColumnD)) 

編輯:假設ColumnD在每個表中的數字是&「least`(在這種情況下)是在給定的列3號的最小值。

編輯:如果列是字符串,確定什麼最大。它可以容納的值&對它做一個.Parse。 例如

MinOfColumnD = Math.Min(Math.Min(int.Parse(s1.ColumnD), int.Parse(s2.ColumnD)), int.Parse(s3.ColumnD))) 
+0

好調用除了這些是字符串列。 (不要問我爲什麼他們不是int ...他們應該是,但我的老闆不希望他們成爲我們得到的數據不是數字) – DJTripleThreat 2011-03-15 19:53:51

+0

@DJ如果這些'字符串'列預計是數字查詢將失敗在這些情況下運行時間,不是一個好的做法,+1的答案,雖然 – 2011-03-15 20:02:24

相關問題