sql - 如何在 Entity Framework 中生成子字符串和整数的连接?

标签 sql linq entity-framework

使用 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/

相关文章:

sql - 按名称查找所有数据库对象?

sql - 从星期一开始的下一周内获取所有生日

SQL IN 语句使用类似的语法?

sql - 排序字母数字列

entity-framework - 使用 Entity Framework 5 保存大图

performance - Linq 解谜器

c# - 这个 LINQ 可以更高效吗?

c# - 关于 IEnumerable 的延迟执行

entity-framework - 指定的 deps.json '$$$' 不存在

c# - .edmx 文件是否在现实世界中使用