关于c#:在具有多个条件的.GroupJoin扩展中,如何使LINQ中的类型与实体匹配?

How to make types match in LINQ to Entities when using .GroupJoin extension with multiple conditions?

我陷入类型匹配问题。 首先,通过检查以下内容来确保语法正确:

正确的Join / GroupJoin实施

我尝试替换所有条件,并发现我的类型不匹配。 这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
        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.]);

我得到的错误特别是不能从用法中推断出类型实参。 我相信潜在的错误是我无法将nullable int与non-nullable int进行匹配。

但是,我很难找到解决方法。 我尝试将非可空int强制转换为" int?"。 我得到这个错误:

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

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

有没有人有什么建议?

在您建议它之前,不允许我将wa.someNullableInt设置为不可为空,这对于程序也没有意义。

在此先感谢您的帮助!


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

1
2
3
4
5
6
7
8
9
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.]);


您应该能够将其强制转换为int?,但是您需要为该字段提供一个名称,而不是在设置现有语法时自动选择它。 您确实提到了尝试此操作,但是不清楚" IntelliSense不喜欢它"是什么意思。 我想象你的意思是你得到这个错误:

Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

您应该能够按照以下方式进行投射:

1
2
3
4
5
wr => new
{
    wr.someMatchingInt,
    someNonNullableInt = (int?)wr.someNonNullableInt
}

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