Почему Платформа Объекта не была бы в состоянии использовать ToString () в операторе LINQ?

Это работает в LINQ к SQL:

var customersTest = from c in db.Customers
                select new
                {
                    Id = c.Id,
                    Addresses = from a in db.Addresses where c.Id.ToString() == 
                        a.ReferenzId select a
                };

foreach (var item in customersTest)
{
    Console.WriteLine(item.Id);
}

Но подобный пример в Платформе Объекта получает сообщение об ошибке, в котором говорится в основном, что не может "перевести его в SQL", вот исходное сообщение об ошибке на немецком языке:

"'LINQ к Объектам' erkennt умирают Methode 'Система. Представьте ToString в виде строки ()' nicht, und diese Methode kann nicht в einen Speicherausdruck übersetzt werden".

Перевод:

"'LINQ к Объектам' не распознает Метод 'Система. Представьте ToString в виде строки ()', этот метод не может быть переведен в выражение памяти.

Кто-либо может пролить какой-либо свет на то, как мы могли заставить этот вид оператора работать в Платформе Объекта или объяснять, почему это получает эту ошибку?

13
задан Edward Tanguay 17 December 2009 в 10:28
поделиться

2 ответа

Проще говоря: LINQ to Entities не знает о преобразовании из вашего типа идентификатора в строку.

Какой тип c.ID ? Есть ли причина, по которой для ID используется один тип, а для ReferenzId - другой? Если возможно, сделайте их одного типа, и тогда у вас больше не будет проблем. Я не знаю, есть ли другие способы выполнения преобразований в LINQ to Entities - они могут быть - но выравнивание типов было бы чище.

Между прочим, это действительно похоже на объединение:

var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

EDIT: Чтобы ответить на ваш комментарий - ToString появляется в IntelliSense, потому что компилятор не имеет реального представления, что будет означать ваш запрос или как он будет переведен. Это совершенно корректный C # и может генерировать допустимое дерево выражений - it '

9
ответ дан 1 December 2019 в 22:39
поделиться

LINQ to Entities, насколько я понимаю (для v1), очень примитивен. Другими словами, он не знает, как взять метод расширения «ToString ()» и сгенерировать для него SQL.

В LINQ to SQL он выполняет метод расширения «ToString ()» перед генерацией SQL. Разница в том, что LINQ to Entities использует IQueryable вместо IEnumerable.

НО, насколько я помню, приведение должно работать (поскольку приведение - это тип данных, а SQL знает о CAST ()).

Итак

c.Id.ToString () действительно должно быть (string) c. Id

(также убедитесь, что это (строка), а не (String)).

Один из недостатков, который я бы сказал об использовании Lambda (в Entity Framework) для генерации выражения SQL вместо чистого LINQ.

Имейте в виду,

-2
ответ дан 1 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: