2016-02-05 84 views
0

對不起,如果我的問題沒有太大意義。讓我解釋。LINQ使用擴展方法語法在不同記錄的多列上加入

我有一個現有的SQL查詢如下:

SELECT 
    T1.Portfolio, T1.ValueDate as CurrentValueDate, 
    T1.DifferencePercent as CurrentDP, 
    T2.ValueDate as PreviousValueDate, 
    T2.DifferencePercent as PreviousDP, 
    CASE 
     WHEN T1.DifferencePercent = T2.DifferencePercent 
      THEN 1 
      ELSE 0 
    END as IsChange 
FROM 
    [AccountingData].[dbo].[NAVRec_NAVSummary] T1 
JOIN 
    [AccountingData].[dbo].[NAVRec_NAVSummary] T2 ON T1.Portfolio = T2.Portfolio AND T2.ValueDate = DATEADD(DAY, CASE DATENAME(WEEKDAY, T1.ValueDate) WHEN 'Sunday' THEN -2 WHEN 'Monday' THEN -3 ELSE -1 END, DATEDIFF(DAY, 0, T1.ValueDate)) 

所以基本上,我很感興趣的投資組合隨着它告訴投資組合的DifferencePercent值是否已經從值改變爲同列顯示投資組合在前一個工作日。

我想使用擴展方法語法將相同的SQL查詢翻譯成LINQ。然而,現在我只是嘗試使用投資組合屬性和當前投資組合的ValueDate和前一個業務日期相同投資組合的ValueDate進行自我加入。

var result = NavList.Join(NavList, 
          outer => new { outer.Portfolio, outer.ValueDate }, 
          inner => new { inner.Portfolio, PD = inner.ValueDate.PreviousBusinessDate() }, 
          (outer, inner) => new { outer, inner }); 

[PreviousBusinessDate()是返回datetime擴展方法]

在這裏,我得到一個錯誤:

The type arguments for method 'System.Linq.Enumerable.Join(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable, System.Func, System.Func, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

有人可以幫助我瞭解的問題和解決方案。

+0

*「方法的類型參數....」* - 您沒有包含**最重要的**信息 - 方法**的名稱**。另外,我不知道它是否相關,但是您不能在投影**表達式**中使用擴展方法。 –

+0

該方法的名稱究竟意味着什麼? Join方法拋出錯誤。 – Lucifer

+0

再一次,錯誤消息是*「**方法的類型參數** ...」*。哪種方法?在代碼片段中有2個方法 - 「加入」和您的自定義擴展方法。我的意思是,當你遇到問題時,包括整個異常信息,大部分時候答案都在那裏。 –

回答

3

的問題是在這裏

outer => new { outer.Portfolio, outer.ValueDate }, 
inner => new { inner.Portfolio, PD = inner.ValueDate.PreviousBusinessDate() }, 

你伸出匿名類型,他們需要完全匹配。爲了匹配,匿名類型必須具有完全相同的簽名,其中包括屬性名稱 s和它們的類型

你的情況,你沒有明確指定的大部分屬性名的,所以上面就相當於

outer => new { Portfolio = outer.Portfolio, ValueDate = outer.ValueDate }, 
inner => new { Portfolio = inner.Portfolio, PD = inner.ValueDate.PreviousBusinessDate() }, 

看到區別?第一行中的第二個成員稱爲ValueDate,而第二行中的第二個成員爲PD

只需將PD替換爲ValueDate,問題就會解決(現在)。

+0

Ahhh..so愚蠢的我。謝謝@Ivan。非常感謝您的幫助。 – Lucifer