Это работает в 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 в виде строки ()', этот метод не может быть переведен в выражение памяти.
Кто-либо может пролить какой-либо свет на то, как мы могли заставить этот вид оператора работать в Платформе Объекта или объяснять, почему это получает эту ошибку?
Проще говоря: 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 '
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.
Имейте в виду,