Linq 2 Entities: объединение двух столбцов разных типов - PullRequest
4 голосов
/ 07 августа 2009

В настоящее время я использую Entity Framework и хочу выполнить запрос Linq с объединением двух столбцов, один из которых имеет тип String, а другой - Int32.

Somethign похож на

from FirstEntity obj in context.FirstEntity 
                      join SecondEntity obj2 in context.SecondEntity on obj.SecondEntityId equals obj2.Id.ToString()

с obj.SecondEntityId как String и obj2.Id как Int32

К сожалению, операция ToString не поддерживается EF. Я застреваю с этой ошибкой (или с некоторыми похожими ошибками, если я хочу преобразовать строку в Int32):

LINQ to Entities не распознает метод метода System.String ToString ()

и до сих пор я не мог найти работу вокруг.

Спасибо за любую помощь.

Ответы [ 4 ]

2 голосов
/ 10 августа 2009

Обычно мы разбиваем что-то вроде этого на 2 запроса (отсутствие ToString () в linq для поддержки сущностей заставляет меня хотеть навредить маленьким детям).

var query1 = (from SecondEntity obj2 in context.SecondEntity
             select obj2.ID).ToList();

// now we're using linq to objects which does support ToString()
query1 = query1.Select(x => x.ToString());

// mixing linq to entities and linq to objects
var query2 = from FirstEntity obj in context.FirstEneity
             join SecondEntity obj2 in query1 on obj.SecondEntityId equals obj2.ID

Я делаю это без VS, так что часть синтаксиса может быть неправильной, и это не очень хорошее решение, но EF - это V1.

0 голосов
/ 12 августа 2009

Поможет ли вам использовать функциональный синтаксис C # вместо специального синтаксиса Linq?

var results = FirstEntity.Join(SecondEntity, 
     obj => obj.SecondEntityId, obj2 => obj2.Id.ToString(), 
    (obj, obj2) => new { First = obj, Second = obj2 });
0 голосов
/ 11 августа 2009

Наконец, я сделал представление на основе таблицы с новым полем int, содержащим преобразованную строку, на стороне БД. Затем я сопоставил свою сущность EF с представлением. Работает:)

Грустно, я не нашел правильного решения на стороне EF. Надеемся, что версия 4.0 решит такие проблемы.

В любом случае, спасибо за помощь.

0 голосов
/ 09 августа 2009

В LINQ to SQL вы можете использовать Convert.ToString(obj2.Id), но, похоже, EF этого не поддерживает (см. этот поток в MSDN ). Тем не менее, вы можете использовать функцию , определенную моделью .

Обновление: Поскольку не похоже, что решение EF будет работать, я просто создал бы представление SQL с преобразованным полем int и любыми другими необходимыми вам полями. Или вы можете сохранить существующие сущности и просто объединиться в виде двух столбцов с идентификаторами int и string. Оптимизатор запросов должен иметь возможность выяснить, что вы делаете, чтобы влияние на производительность было незначительным.

...