2010-03-17 64 views
6

爲什麼不能我這樣做:爲什麼LINQ to Entities不能識別某些方法?

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

而且必須這樣做:

​​

我必須承認這是一個更可讀的代碼,但爲什麼不能這樣做?

回答

9

關於它的事情是,LINQ查詢被轉化編譯器轉換爲表達式樹。這個表達式樹然後被轉換成T-SQL並傳遞給服務器。 LINQ to SQL將某些方法(如String.Contains)映射到T-SQL等價物。

在第一個例子中,LINQ顯然沒有將Convert.ToInt32映射到任何東西並拋出異常。它在你的第二個例子中工作的原因是因爲Convert.ToInt32調用完成外部的查詢,所以它不是表達式樹的一部分,也不需要轉換爲T-SQL。

This MSDN page描述了LINQ to SQL如何將各種數據類型,操作符和方法轉換爲T-SQL。 (雖然文檔確實支持Convert.ToInt32,但我不確定此處可能會發生什麼。)

對不起剛剛意識到這是ADO.NET實體框架,而不是LINQ to SQL。 This page lists ADO.NET實體框架映射。這有點限制,主要是因爲它需要與多個提供商合作。

+1

有沒有辦法讓L2E將這些方法/函數映射到T-SQL函數? +1清除說明 – Luiscencio 2010-03-17 23:15:40

+0

不,但是如果您在SQL中創建用戶定義的函數並將其添加到數據上下文中,則可以在查詢中使用它們。 – Josh 2010-03-17 23:16:42

+0

因此,如果我使用mysql並將一些存儲過程添加到我的數據庫,我可以以某種方式調用它? – Luiscencio 2010-03-17 23:17:46

0

因爲你的LINQ to Ent。並沒有將查詢編譯成MSIL與所有的元數據,而只是將查詢翻譯成一些extantion方法,並且受限於languge的lambda解析能力。這意味着,

驗證碼:
var results = from c in SomeCollection where c.SomeProperty < someValue * 2 select new {c.SomeProperty, c.OtherProperty};

是一樣的:

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

相關問題