提问人:spiral 提问时间:1/26/2023 更新时间:1/26/2023 访问量:76
Linq Join 多键键的一侧键为 null
Linq Join multi key one side of key is null
问:
尝试联接两个表,其中一侧的部分键可为 null。得到“无法从用法中推断出类型参数”,我认为这与键中的不匹配类型有关。
TableA.GroupJoin(TableB,
a => new {a.IntKeyA, a.StringKeyA},
b => new {b.NullIntKeyB, b.StringKeyB}
(tabA, tabB) => new {tabA, tabB});
尝试在 TableA 中强制转换键的类型
a => new (int?, string) {a.IntKeyA, a.StringKeyA}
或
a => (int?, string)(new {a.IntKeyA, a.StringKeyA})
尝试合并 TableB 中的键,魔术数字 0 不是很好,但在这种情况下会起作用。
b => new {b.NullIntKeyB ?? 0, b.StringKeyB}
尝试了 GetValueOrDefault
b => new {b.NullIntKeyB.GetValueOrDefault(), b.StringKeyB}
我想我可能会定义一个类来保存密钥,但我真的不想每次出现这个问题时都这样做。
答:
0赞
spiral
1/26/2023
#1
目前,这似乎奏效了,但我还不打算将其标记为答案,希望有更简单的方法。
class ReportKey
{
private int? IntKey { get; }
private string StringKey { get; } = string.Empty;
internal ReportKey(int? intKey, string stringKey)
{
IntKey = intKey;
StringKey = stringKey;
}
public override bool Equals(object obj)
{
var item = obj as ReportKey;
if (item == null) return false;
return this.IntKey == item.Intkey &&
StringKey == item.StringKey;
}
public override int GetHashCode()
{
return $"{IntKey}{StringKey}".GetHashCode();
}
}
...
TableA.GroupJoin(TableB,
a => new ReportKey(a.IntKeyA, a.StringKeyA),
b => new ReportKey(b.NullIntKeyB, b.StringKeyB),
(tabA, tabB) => new {tabA, tabB});
评论
new { (int?)a.IntKeyA, a.StringKeyA }