在寫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
似乎好像有點多此一舉 XD
然後還沒有時間試試看如果是 update 或是要 select join 的時候會產生啥東西 0rz
沒有留言:
張貼留言