Это работает в LINQ-to-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);
}
Но аналогичный пример в Entity Framework получает сообщение об ошибке, которое говорит, что в основном он не может «перевести его на SQL», вот оригинальное сообщение об ошибке на немецком языке:
"LINQ to Entities" erkennt die Methode "System.String ToString () 'nicht, und diese Methode kann nicht in einen Speicherausdruck ¼¼bersetzt werden."
Перевод:
«LINQ to Entities не распознает метод System.String ToString ()», этот метод не может быть преобразован в выражение памяти.
Может кто-нибудь пролить свет на то, как мы можем заставить такого рода оператор работать в Entity Framework, или объяснить, почему он получает эту ошибку?
Проще говоря: LINQ to Entities не знает о преобразовании вашего типа идентификатора в строку.
Какой тип c.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 };
РЕДАКТИРОВАТЬ: Чтобы ответить на ваш комментарий - ToString
появляется в IntelliSense, потому что компилятор не имеет реального представления о том, что будет означать ваш запрос или как он будет переведен. Это совершенно правильный C # и может генерировать правильное дерево выражений - просто EF не знает, как преобразовать это дерево выражений в SQL.
Вы можете попробовать использовать Convert.ToString(c.Id)
вместо простого вызова c.Id.ToString()
...