我正在尝试使用C#linq连接两个表到实体。
一个表有客户端,另一个表有许可证。这些表由Client_ID和ClientLicence_ClientID连接。由于某种原因(它们不是我的表),Client_ID是一个int,而ClientLicence_ClientID是一个字符串。
我的代码是:
var licences = (from client in entities.Clients
join licence in entities.ClientLicences
on new { clientId = SqlFunctions.StringConvert((double)client.Client_ID) } equals
new { licence.ClientLicence_ClientID }
into clientGroup
where (filter.clientId == 0 || client.Client_ID == filter.clientId)
select licence);
当我尝试编译它时,我收到一个错误:join子句中某个表达式的类型不正确。调用'GroupJoin'时类型推断失败。
如果我注释掉where语句,那么它可以工作(尽管没有过滤结果)。
filter变量是传递给函数的类。它只有一个属性:int clientId。
答案 0 :(得分:6)
看看你的加入:
join licence in entities.ClientLicences on
new { clientId = SqlFunctions.StringConvert((double)client.Client_ID) }
equals
new { licence.ClientLicence_ClientID }
into clientGroup
关键类型是:
clientId
ClientLicence_ClientID
这两个匿名类型无法进行相等性比较。实际上,我怀疑你根本不需要匿名类型。我希望这可行:
join licence in entities.ClientLicences on
SqlFunctions.StringConvert((double)client.Client_ID)
equals
licence.ClientLicence_ClientID
into clientGroup
(显然你不需要所有的新行 - 我只是为了清晰起见而试图将各个部分分开。)
你声称如果没有where
条款就行了 - 但这会非常令人惊讶,因为它是连接问题。