我遇到了类型匹配问题。我首先通过检查以下内容来确保我的语法正确:
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变为不可为空,也不允许该程序有意义。
提前感谢您的帮助!
答案 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.]);