4

我正在尝试使用 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 语句,那么它就可以工作(尽管没有过滤结果)。

过滤器变量是一个传递给函数的类。它只有一个属性:int clientId。

4

1 回答 1

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子句它可以工作 - 但这将非常令人惊讶,因为它是一个问题的连接。

于 2012-05-19T15:54:01.683 回答