1

我被困在类型匹配问题上。我首先通过检查以下内容来确保我的语法正确:

正确的 Join/GroupJoin 实施

我试图替换我的所有条件,并注意到我的类型不匹配。这是我的代码:

        var waQ = someRepository.GetAllQ();
        var wrQ = someOtherRepository.GetAllQ();

        query = waQ
            .GroupJoin(wrQ,
                    wa => new { wa.someInt, wa.someNullableInt },
                    wr => new { wr.someMatchingInt, wr.someNonNullableInt },
                    (wa, wr) => new { wa, 
                        reqOrderID = wr.FirstOrDefault().someMatchingInt,
                        reqWorkerID = wr.FirstOrDefault().someNonNullableInt
                    })
            .Select([etc.]);

具体来说,我得到的错误是无法从用法中推断出类型参数。我相信潜在的错误是我无法将可为空的 int 与不可为空的 int 匹配。

但是,我很难找到解决方法。我尝试将不可为空的 int 强制转换为“作为 int?” 我得到了这个错误:

无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

我也尝试过(int?)并尝试将它们都转换为字符串(.ToString())。没运气。

有没有人有什么建议?

在你提出建议之前,我不能让 wa.someNullableInt 不可为空,这对程序也没有意义。

提前感谢您的帮助!

4

2 回答 2

1

您应该能够将其转换为,int?但您需要为该字段提供一个名称,而不是在设置现有语法时自动拾取它。您确实提到过尝试这个,但不清楚“并且 IntelliSense 不喜欢那样”是什么意思。我想你的意思是你得到了这个错误:

无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

您应该可以按如下方式进行转换:

wr => new
{
    wr.someMatchingInt,
    someNonNullableInt = (int?)wr.someNonNullableInt
}

someNonNullableInt =部分将是该项目的给定字段名称。

于 2013-09-30T03:20:02.537 回答
1

问题是,第二个和第三个参数是Func<TOuter, TKey>and Func<TInner, TKey>。它们应该具有完全相同的返回类型TKey。您有两种不同的匿名类型new { wa.someInt, wa.someNullableInt }new { wr.someMatchingInt, wr.someNonNullableInt }. 要创建一种类型,您应该为字段命名并转换为类似的类型。

query = waQ
        .GroupJoin(wrQ,
                wa => new { si = wa.someInt, nsi = wa.someNullableInt },
                wr => new { si = wr.someMatchingInt, nsi = (int?)wr.someNonNullableInt },
                (wa, wr) => new { wa, 
                    reqOrderID = wr.FirstOrDefault().someMatchingInt,
                    reqWorkerID = wr.FirstOrDefault().someNonNullableInt 
                })
        .Select([etc.]);
于 2013-09-30T03:25:57.493 回答