使用 Entity Framework ,我试图连接两个这样的表。
...
join f in ent.FTypes on Int32.Parse(c.CourseID[0].ToString()) equals f.FTypeID
...
字符串 CourseID 的第一个字符是一个数字,而 FTypeID 是一个 int。
但这似乎不起作用。我得到的异常消息是:
LINQ to Entities 无法识别方法 'Int32 Parse(System.String)' 方法,并且此方法无法转换为存储表达式。"} System.Exception {System.NotSupportedException}
我要复制的是等效的 SQL 字符串(工作正常):
join FType f on SUBSTRING(c.CourseID, 1, 1) = f.FTypeID
有没有人有解决方案必须在 LINQ to Entities 中执行此操作?
最佳答案
这是一个相当糟糕的连接,但我在 Entity Framework 中用类似的数据做了一些测试,并得出了一些你可以在你的数据上测试的东西。
它使用 string.Substring
从字符串操作数中获取第一个字符,然后使用仅 EF 方法的组合 SqlFunctions.StringConvert
(这些方法可以在 System.Data.Objects.SqlClient 中找到)并转换为 double
1 最后一个 string.Trim
2 为您的整数操作数。
我已经对此进行了测试,并确认至少在 EF 4 中支持所有功能。问题中提出或推荐的其他几种方法不起作用,因为 Entity Framework 不知道如何将它们转换为适当的 SQL 等效项。
join f in ent.FTypes
on c.CourseID.Substring(0, 1)
equals SqlFunctions.StringConvert((double)f.FTypeID).Trim()
它生成一个 SQL 连接,如下所示:
INNER JOIN [dbo].[FTypes] AS [Extent2]
ON ((SUBSTRING([Extent1].[CourseID], 0 + 1, 1)) = (LTRIM(RTRIM(STR( CAST( [Extent2].[FTypeID] AS float))))))
OR ((SUBSTRING([Extent1].[CourseID], 0 + 1, 1) IS NULL) AND (LTRIM(RTRIM(STR( CAST( [Extent2].[FTypeID] AS float)))) IS NULL))
因此,基于此,您可能希望根据需要进行一些额外的过滤。
试一试,看看这是否有助于解决问题。
1 强制转换为 double 是必要的,因为
SqlFunctions.StringConvert
没有整数重载,也没有其他单一的最佳匹配,所以我强制使用一个。2 生成的字符串需要修剪,因为字符串转换会产生一些多余的填充。
关于sql - 如何在 Entity Framework 中生成子字符串和整数的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16899472/