2010-03-17 37 views
6

Tại sao không thể Tôi làm điều này:Tại sao LINQ to Entities không nhận ra một số Phương thức nhất định?

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(); 

Và phải làm điều này:

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(); 

Tôi phải thừa nhận nó là một mã dễ đọc hơn nhưng tại sao không thể này được thực hiện?

Trả lời

9

Những điều về nó là LINQ truy vấn được biến đổi bởi trình biên dịch thành một cây biểu thức. Cây biểu thức này sau đó được chuyển đổi thành T-SQL và được chuyển tới máy chủ. LINQ to SQL ánh xạ các phương thức nhất định như String.Contains tới các T-SQL tương đương.

Trong ví dụ đầu tiên, LINQ dường như không ánh xạ Convert.ToInt32 thành bất kỳ thứ gì và ngoại lệ được ném. Lý do nó hoạt động trong ví dụ thứ hai của bạn là do cuộc gọi Convert.ToInt32 được thực hiện bên ngoài truy vấn do đó nó không phải là một phần của cây biểu thức và không cần phải được chuyển đổi thành T-SQL.

This MSDN page mô tả cách LINQ to SQL dịch các kiểu dữ liệu, toán tử và phương thức khác nhau thành T-SQL. (Mặc dù tài liệu đề xuất Convert.ToInt32 được hỗ trợ vì vậy tôi không chắc chắn những gì khác có thể xảy ra ở đây.)

Xin lỗi vừa nhận ra đây là ADO.NET Entity Framework, không phải LINQ to SQL. This page lists ánh xạ khung thực thể ADO.NET. Đó là một chút hạn chế hơn, chủ yếu là bởi vì nó cần phải làm việc với nhiều nhà cung cấp.

+1

Có cách nào để làm cho L2E ánh xạ các phương thức/hàm đến các hàm T-SQL không? +1 giải thích rõ ràng – Luiscencio

+0

Không, nhưng nếu bạn tạo một hàm do người dùng định nghĩa trong SQL và thêm hàm đó vào ngữ cảnh dữ liệu của bạn, bạn có thể sử dụng chúng trong truy vấn của mình. – Josh

+0

vì vậy nếu tôi đang sử dụng mysql và thêm một số thủ tục lưu trữ vào DB của tôi, tôi có thể gọi nó bằng cách nào đó? – Luiscencio

0

Vì LINQ to Ent của bạn. không biên dịch truy vấn vào MSIL với tất cả các dữ liệu meta, nhưng chỉ đơn giản dịch truy vấn vào một vài phương thức extantion và bị ràng buộc với lambda phân tích cú pháp abuilities của languge. Điều đó có nghĩa rằng

mã này:
var results = from c in SomeCollection where c.SomeProperty < someValue * 2 select new {c.SomeProperty, c.OtherProperty};

cũng giống như thế này:

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

Các vấn đề liên quan