LINQ 使用扩展方法语法连接具有不同记录的多个列

Luc*_*fer 1 c# linq sql-server self-join

对不起,如果我的问题没有多大意义。让我解释。

我有一个现有的 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))
Run Code Online (Sandbox Code Playgroud)

所以基本上,我对显示投资组合以及一列感兴趣,该列说明投资组合的DifferencePercent价值是否与前一个工作日相同投资组合的价值发生了变化。

我正在尝试使用扩展方法语法将相同的 sql 查询转换为 LINQ。但是,现在我只是想使用 Portfolio 属性和今天的 Portfolio 的 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 });
Run Code Online (Sandbox Code Playgroud)

[PreviousBusinessDate() 是一个返回 DateTime 的扩展方法]

在这里,我收到一个错误:

无法从用法推断方法“System.Linq.Enumerable.Join(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable, System.Func, System.Func, System.Func)”的类型参数。尝试明确指定类型参数。

有人可以帮助我了解问题和解决方案。

Iva*_*oev 5

问题就在这里

outer => new { outer.Portfolio, outer.ValueDate }, 
inner => new { inner.Portfolio, PD = inner.ValueDate.PreviousBusinessDate() }, 
Run Code Online (Sandbox Code Playgroud)

您正在投影匿名类型,它们需要完全匹配。为了匹配,匿名类型必须具有完全相同的签名,其中包括属性名称和它们的类型

在您的情况下,您没有明确指定大部分属性名称,因此上面的内容等效于

outer => new { Portfolio = outer.Portfolio, ValueDate = outer.ValueDate }, 
inner => new { Portfolio = inner.Portfolio, PD = inner.ValueDate.PreviousBusinessDate() }, 
Run Code Online (Sandbox Code Playgroud)

看到不同?第一行中的第二个成员在ValueDate第二个 - 中被调用PD

只需替换为PDValueDate问题就会解决(暂时)。