我的代码是:
var currency = (from ac in db.shop
join cur in db.books
on ac.CODE equals cur.CODE.ToString() //here is the Error
// because "ac.code is type strig" & "cur.code is type long
where ac.ID == merchantId
select new Currency()
{
ShopCode = ac.CODE,
PosCode = ac.POSCODE,
}).ToList();
我发现.ToString(),SqlFunctions.StringConvert(long)在连接查询条件下不起作用,但在查询中的“选择”区域中工作。 但Devart.Data.Oracle.Entity.OracleFunctions.ToChar((长)cur.CODE)工作正常。由于我使用的是实体框架,因此不应该遇到特定数据库类型(即oracle或sql server)的问题。它应该可以工作,即使我将来从oracle更改为sql。
请给我一个解决方案。
答案 0 :(得分:0)
你试过这个吗?
尝试:ac.CODE equals (string)cur.CODE
答案 1 :(得分:0)
您可以在数据库上创建VIEW Currency
并在视图上执行查询。
以下是Linq to Entities支持的方法列表,如果不支持转换,则无法执行。 http://msdn.microsoft.com/en-us/library/bb738681.aspx
答案 2 :(得分:0)
问题是,EF正在尝试将整个表达式转换为T-SQL查询。 所以它看起来类似于:
select ac.CODE, cur.CODE from shop ac
inner join books cur on ac.CODE = cur.CODE
这是你的问题。 CODE字段具有不同的类型,服务器无法加入它们。 在T-SQL中,您可以使用CAST,但由于EF不支持此类操作,因此您无法执行任何操作。 毕竟,为什么要将这些代码存储在字符串中?如果您有这样的查询,那么在大多数情况下,您的数据库架构存在一些问题。 我建议你看一下架构并重构它,所以CODE总是类型很长。一切都会奏效。
如果你仍然真的想为你的列使用不同的类型。您可以查看此问题,了解如何执行CAST Convert String to Int in EF 4.0
答案 3 :(得分:0)
这可以解决你的问题:
var currency = (from ac in db.shop
join cur in db.books
let codestr = cur.CODE.ToString()
on ac.CODE equals codestr
where ac.ID == merchantId
select new Currency()
{
ShopCode = ac.CODE,
PosCode = ac.POSCODE,
}).ToList();