C# .Join()上的LINQ到SQL错误

C# .Join()上的LINQ到SQL错误,c#,sql,database,linq,C#,Sql,Database,Linq,我试图查询一个数据库并连接两个表。我从来没有这样使用过Join(),第二个Join()出现错误: var调整=data.Inventory\u归档 .Where(i=>i.Location==comboBox3.Text&& upcCodes.包含(即UPCCode)和 (i.AVtime.Value.Date>=dateTimePicker1.Value.Date&& i、 AVtime.Value.Date=dateTimePicker1.Value.Date&& i、 BVtime.Val

我试图查询一个数据库并连接两个表。我从来没有这样使用过Join(),第二个Join()出现错误:

var调整=data.Inventory\u归档
.Where(i=>i.Location==comboBox3.Text&&
upcCodes.包含(即UPCCode)和
(i.AVtime.Value.Date>=dateTimePicker1.Value.Date&&
i、 AVtime.Value.Date=dateTimePicker1.Value.Date&&
i、 BVtime.Value.Date new{i.UPCCode})
.选择(i=>new
{
ID=i.Max(x=>x.ID),
i、 键.UPCCode
})
.Join(data.Inventory\u存档,a=>a.ID,
b=>b.ID,(a,b)=>new{a,b})
.Join(data.BQItems,x=>new{x.a.UPCCode,x.b.Location},
y=>new{y.UPC_代码,y.Location},(x,y)=>new
{
ID=x.a.ID,
UPCCode=x.a.UPCCode,
日期=x.b.BVtime.Value.Date,
描述=y.描述,
BVamount=x.b.BVamount,
AVamount=x.b.AVamount,
差额=x.b.A金额-x.b.b金额,
平均成本=x.b.平均成本,
ExtCost=(x.b.AVamount-x.b.BVamount)*x.b.AverageCost
});
x.a.UPCCode
x.b.Location
y.UPC\u code
y.Location
都是字符串

这就是错误:

无法根据用法推断方法“System.Linq.Enumerable.Join(System.Collections.Generic.IEnumerable,System.Collections.Generic.IEnumerable,System.Func,System.Func,System.Func)”的类型参数。请尝试显式指定类型参数


如果我不包括“位置”列并只使用“UPCCode”,它会起作用,但当我添加第二个“位置”列时,会出现错误

我怀疑这就是问题所在-至少有一个问题:

您正在尝试使用两种不同的匿名类型作为密钥类型进行连接。它们具有不同的属性-一种具有
UPCCode
,另一种具有
UPC\u code
。您可能需要:

.Join(data.BQItems, x => new { x.a.UPCCode, x.b.Location },
                    y => new { UPCCode = y.UPC_Code, y.Location },
                    ...)

或者只需与属性名称更加一致,以便在任何地方使用
UPCCode
UPC\u code
,而不是混合使用。

您必须最关心'equals'子句两侧的数据类型,它们应该是相同的数据类型,如int和int,或string和string


或者使用lambda表达式,Join子句中的第二个和第三个参数必须是相同的数据类型。

很好的捕获人,谢谢。它解决了问题。这让我很失望,因为如果我不按“位置”加入,它将接受“UPCCode”和“UPC\u Code”@user2777664:如果您也使用匿名类型,则不会这样做。当您仅使用值(作为字符串或其他形式)时,这只是将字符串与字符串进行匹配,这很好。连接多个列时的关键点是:列类型必须相同,列名也必须相同。
.Join(data.BQItems, x => new { x.a.UPCCode, x.b.Location }, 
                    y => new { y.UPC_Code, y.Location },
                    ...)
.Join(data.BQItems, x => new { x.a.UPCCode, x.b.Location },
                    y => new { UPCCode = y.UPC_Code, y.Location },
                    ...)