Почему наклон я делаю это:
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();
Я должен признать, что это - более читаемый код, но почему наклон это быть сделанным?
Дело в том, что запросы 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. Он немного более строгий, в основном потому, что он должен работать с несколькими поставщиками.
Поскольку ваш 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});