преобразование int в строку в linq в entites - PullRequest
2 голосов
/ 11 ноября 2011

Мой код:

        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 ((long) cur.CODE) работает нормально.Так как я использую Entity Framework, у него не должно быть проблем с конкретными типами БД (например, Oracle или SQL Server).Это должно работать, даже если в будущем я перейду с оракула на SQL.

Пожалуйста, дайте мне решение для этого.

Ответы [ 4 ]

0 голосов
/ 11 ноября 2011

это должно решить вашу проблему:

  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();
0 голосов
/ 11 ноября 2011

Вы можете создать VIEW Currency в базе данных и выполнить запрос в представлении.

Вот список поддерживаемых методов для Linq to Entities, если преобразование не поддерживается, вы не можете выполнить его.http://msdn.microsoft.com/en-us/library/bb738681.aspx

0 голосов
/ 11 ноября 2011

Проблема в том, что 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 всегда имеет тип long.Тогда все будет работать.

Если вы все еще действительно хотите использовать разные типы для ваших столбцов.Вы можете посмотреть на этот вопрос, чтобы увидеть, как выполнить CAST Преобразование строки в Int в EF 4.0

0 голосов
/ 11 ноября 2011

Вы пробовали использовать это.

Попробуйте: ac.CODE equals (string)cur.CODE

...