将linq转换为实体中的字符串

时间:2011-11-11 07:50:28

标签: c# .net linq-to-entities tostring

我的代码是:

        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。

请给我一个解决方案。

4 个答案:

答案 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();