2014/01/05

[筆記] LinQ to SQL 自動產生 T-SQL 問題


在寫LinQ的時候無聊開了一下Profiler看看到底會跑出什麼東西來

看到一個現象



User user = (from u in db.User.ToList()
       where u.uid == uid
       select u).FirstOrDefault();

這個語法跑下去之後會在 Profiler 錄到下列語法


SELECT
[Extent1].[pk] AS [pk],
[Extent1].[uid] AS [uid],
... 略 ...
FROM [dbo].[User] AS [Extent1]


然後用下面這個方法撈資料時錄到的 T-SQL會是

LinQ:
  
 User user = db.User.Where(u => u.uid == uid).FirstOrDefault();

T-SQL:

  
exec sp_executesql N'SELECT TOP (1)
[Extent1].[pk] AS [pk],
[Extent1].[uid] AS [uid],
... 略 ...
FROM [dbo].[User] AS [Extent1]
WHERE ([Extent1].[uid] = @p__linq__0)
,N'@p__linq__0 nvarchar(4000),@p__linq__0=N'Corsair'


明明第一個就 where 了半天 但是 SQL 卻一行都沒有 @_@

看起來好像是 IEnumerable 跟 IQueryable 的差異導致

--

後來 Google 到,似乎還真的是這個緣故 因為 db.User.ToList() 之後是 IEnumerable 型別

嘗試用下列方法後就可以有 Where 啦



IQueryable Users = db.User;

User user = (from u in Users
 where u.uid == uid && u.upw == upw
 select u).FirstOrDefault();

阿但是,.....

似乎好像有點多此一舉 XD

然後還沒有時間試試看如果是 update 或是要 select join 的時候會產生啥東西 0rz




沒有留言:

張貼留言