在使用具有多个条件的.GroupJoin扩展时,如何使LINQ to Entities中的类型匹配?

时间:2013-09-30 03:05:00

标签: c# linq

我遇到了类型匹配问题。我首先通过检查以下内容来确保我的语法正确:

Proper Join/GroupJoin implementation

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

        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与不可为空的int匹配。

但是,我很难找到解决方法。我尝试将非可空int“转换为int?”我收到了这个错误:

  

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

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

有人有任何建议吗?

在你建议之前,我不允许将wa.someNullableInt变为不可为空,也不允许该程序有意义。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

  

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

您应该能够按如下方式投射:

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

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

答案 1 :(得分:1)

问题是,第二和第三个参数是Func<TOuter, TKey>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.]);