无法从用法推断 Lamda Link 类型参数

Lamda Link type arguments cannot be inferred from usage

我们正在使用实体,我正在尝试在 2 列上加入 2 tables。一个 ID 和服务器 ID。我的原始查询没有考虑服务器(这是我正在尝试修复的问题)

var client = _Context.Address
                .Join(_Context.Clients.Where(c => c.Key == Key),
                    a => a.AddressId,
                    c => c.AddressId,
                    (a, c) =>  a ).FirstOrDefault();

这行得通。但是当我添加服务器时

var client = _Context.Address
                .Join(_Context.Clients.Where(c => c.Key == Key),
                    a => new { a.AddressId, a.ServerId},
                    c => new { c.AddressId, c.ServerId},
                    (a, c) =>  a ).FirstOrDefault();

连接现在在标题中抛出错误。在我的研究中,我发现名称和类型必须匹配。名称确实匹配,并且我尝试分配它们以确保双重确定,但这并不能解决问题。查看实体中的定义,列在地址 table 中为 int,但在客户端中为 nullable int table.
如何将 int 列连接到可为 null 的 int?

编辑: 来自客户table

public int? AddressId { get; set; }

public int? ServerId { get; set; }

来自地址 table

[Key]   
[Column(Order = 0)]      
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]   
public int AddressId { get; set; }

[Key]
[Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ServerId { get; set; }

How can I join an int column to an nullable int?

你需要让它们成为同一类型,否则编译器将无法决定 TKey 应该是什么,因为 AnonType<int, int>AnonType<int?, int?> 之间没有隐式转换例如将 non-nullable 整数转换为 (int?) 因此它们匹配

Join(_Context.Clients.Where(c => c.Key == Key),
  a => new { AddressId = (int?)a.AddressId, ServerId = (int?)a.ServerId},
  c => new { c.AddressId, c.ServerId},

你之前逃脱了它,因为对于单个键参数存在从 intint? 的隐式转换,但如果你使用带有连接键中的单个道具:

//this would fail too
Join(_Context.Clients.Where(c => c.Key == Key),
  a => new { AddressId }, 
  c => new { c.AddressId },