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

标签 c# sql-server linq 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))

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

我正在尝试使用扩展方法语法将相同的 sql 查询转换为 LINQ。但是,现在我只是尝试使用 Portfolio 属性和今天投资组合的 ValueDate 以及同一投资组合在前一个工作日的 ValueDate 进行 self 连接。

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.

谁能帮我理解问题和解决方案。

最佳答案

问题就在这里

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

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

在你的情况下,你没有明确指定大部分属性名称,所以上面的内容等同于

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

看出区别了吗?第一行中的第二个成员称为 ValueDate,而第二行中的第二个成员称为 PD

只需将 PD 替换为 ValueDate 即可(暂时)解决问题。

关于c# - LINQ 使用扩展方法语法连接具有不同记录的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35231587/

相关文章:

c# - .NET 自定义 Xml 序列化

sql-server - 在查询周围添加条件会使时间增加 2400% 以上

sql-server 分组

c# - Linq to Entities 查询可空数据类型

c# - 没有时间的日期从和到过滤 c# mvc

c# - Facebook 多账户

c# - 如何在 C# 中验证 URL 以避免 404 错误?

sql-server - 什么是 SQL Server Rand 函数算法?

c# - 如何初始化为空的 IEnumerable<Object> 并允许对其进行 Concat?

c# - 如何在字符串数组上使用 Sum - LINQ?