Lambda链接类型参数无法推断:Entity Framework中int与可空int列的多表连接问题问询
解决EF中int与int?类型多列连接的Lambda推断问题
嘿,这个问题我之前也碰到过!根源在于你连接用的匿名类型里,两边的属性类型可空性不匹配——Address的AddressId/ServerId是int(非空),而Clients里的是int?(可空),编译器没法自动推断出一致的连接键类型,所以才抛出那个“Lambda链接类型参数无法推断”的错误。
下面给你两种靠谱的解决方案,根据你的业务需求选就行:
方案1:将非空类型显式转为可空类型
把Address的两个字段转成int?,让两边匿名类型的属性类型完全对齐。这种方法不需要过滤数据,EF会自动处理连接时的匹配逻辑(null值不会和任何非null值匹配):
var client = _Context.Address .Join( _Context.Clients.Where(c => c.Key == Key), a => new { AddressId = (int?)a.AddressId, ServerId = (int?)a.ServerId }, // 显式转可空类型 c => new { c.AddressId, c.ServerId }, // 这边本来就是可空类型 (a, c) => a ) .FirstOrDefault();
方案2:提前过滤可空字段并转为非空类型
如果你的业务逻辑里,Clients中AddressId或ServerId为null的记录根本不需要参与连接,可以先过滤掉这些数据,再把可空字段转为非空的int,这样两边的类型也能完美匹配:
var client = _Context.Address .Join( // 先过滤掉AddressId/ServerId为null的无效记录 _Context.Clients.Where(c => c.Key == Key && c.AddressId.HasValue && c.ServerId.HasValue), a => new { a.AddressId, a.ServerId }, // 非空int类型 c => new { AddressId = c.AddressId.Value, ServerId = c.ServerId.Value }, // 取出可空字段的非空值 (a, c) => a ) .FirstOrDefault();
为什么单列连接没问题?
顺便提一句,你之前单列连接能运行,是因为EF的Join方法在处理单个值的时候,允许int和int?之间的隐式转换;但多列匿名类型要求属性的名称、类型(包括可空性)完全一致,编译器不会自动做隐式转换,所以必须手动统一类型。
内容的提问来源于stack exchange,提问作者Matt Bodily
相关产品推荐
相关产品推荐

