Почему делают LINQ к Объектам не распознает определенные Методы?

Почему наклон я делаю это:

usuariosEntities usersDB = new usuariosEntities();      
foreach (DataGridViewRow user in dgvUsuarios.Rows)
{
   var rowtoupdate = 
       usersDB.usuarios.Where(
       u => u.codigo_usuario == Convert.ToInt32(user.Cells[0].Value)
       ).First();
   rowtoupdate.password = user.Cells[3].Value.ToString();
}
usersDB.SaveChanges();

И должны сделать это:

usuariosEntities usersDB = new usuariosEntities();      
foreach (DataGridViewRow user in dgvUsuarios.Rows)
{
   int usercode = Convert.ToInt32(user.Cells[0].Value);
   var rowtoupdate = 
       usersDB.usuarios.Where(u => u.codigo_usuario == usercode).First();
   rowtoupdate.password = user.Cells[3].Value.ToString();
}
usersDB.SaveChanges();

Я должен признать, что это - более читаемый код, но почему наклон это быть сделанным?

6
задан Luiscencio 17 March 2010 в 23:03
поделиться

2 ответа

Дело в том, что запросы LINQ преобразуются компилятором в дерево выражений. Затем это дерево выражений преобразуется в T-SQL и передается на сервер. LINQ to SQL сопоставляет определенные методы, такие как String.Contains, с эквивалентами T-SQL.

В первом примере LINQ явно не сопоставляет Convert.ToInt32 с чем-либо, и создается исключение. Причина, по которой он работает во втором примере, заключается в том, что вызов Convert.ToInt32 выполняется вне запроса, поэтому он не является частью дерева выражения и его не нужно преобразовывать в T-SQL.

На этой странице MSDN описывается, как LINQ to SQL преобразует различные типы данных, операторы и методы в T-SQL. (Хотя в документации действительно говорится, что Convert.ToInt32 поддерживается, поэтому я не уверен, что еще здесь может происходить.)

Извините, я только что понял, что это ADO.NET Entity Framework, а не LINQ to SQL. На этой странице перечислены сопоставления ADO.NET Entity Framework. Он немного более строгий, в основном потому, что он должен работать с несколькими поставщиками.

9
ответ дан 10 December 2019 в 02:46
поделиться

Поскольку ваш LINQ to Ent. не компилирует запрос в MSIL со всеми метаданными, а просто переводит запрос в несколько методов расширения и ограничен возможностями лямбда-синтаксического анализа языка. Это означает, что

этот код:
var results = from c в SomeCollection , где c.SomeProperty

совпадает с этим:

var results = SomeCollection
.Where (c => c.SomeProperty
.Select (c => new {c. SomeProperty, c.OtherProperty});

0
ответ дан 10 December 2019 в 02:46
поделиться
Другие вопросы по тегам:

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