string id = (from c in context.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
1)如何使用Linq符合上面的查詢來改善上述性能。 我們僅限於使用.NET 3.5。Linq to SQL到Linq編譯的性能
2)以百分比的形式使用以上代碼的編譯linq查詢的性能增益是多少?
string id = (from c in context.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
1)如何使用Linq符合上面的查詢來改善上述性能。 我們僅限於使用.NET 3.5。Linq to SQL到Linq編譯的性能
2)以百分比的形式使用以上代碼的編譯linq查詢的性能增益是多少?
您將創建編譯查詢通過:
Func<YourContextType, int, string> query = CompiledQuery.Compile(
(YourContextType context, int id) =>
context.Users.Where(u => u.u_id == id).Select(u => u.u_id)
.SingleOrDefault()
);
你可以這樣使用它作爲:
string resultId = query(context, Id);
至於性能增益,這可能是顯著,但它也可能微乎其微。這實際上取決於查詢執行的速度,以及您可以重複使用編譯查詢的頻率。在許多情況下,使用cmopped查詢實際上是較慢的,因爲編譯的開銷並不能彌補速度的提升。您需要進行測量以確定這是否值得。
請注意,如果您知道只有一個唯一的ID,則還可以使用FirstOrDefault()
而不是SingleOrDefault()
來加速原始查詢。
聲明你的編譯的查詢是這樣的:
static readonly Func<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE> compiledQuery =
CompiledQuery.Compile<ENTITIES, YOUR_ID_TYPE, RETURN_VALUE_TYPE>(
(ctx, Id) => (from c in ctx.Users
where c.u_id == Id
select c.u_id).SingleOrDefault();
然後在你的代碼中調用編譯後的查詢:
RETURN_VALUE_TYPE results = compiledQuery.Invoke(context, Id);
而且關於能夠依賴於幾件事情的性能改善,但是要記住在LINQ查詢執行的範圍內,查詢編譯是該過程的一個昂貴部分。任何時候,如果您將LINQ查詢邏輯添加到基於LINQ to SQL或Entity Framework的應用程序中,則應考慮預編譯查詢並重新使用它們。
一個厚顏無恥的選擇將是:不涉及LINQ這樣一個微不足道但性能關鍵的操作。例如,用短小精悍點網:
string id = connection.Query<string>(
@"select u_id from Users where u_id = @id",
new { id = Id }).SingleOrDefault();
從而徹底避免了所有的LINQ抽象,直接對數據庫(完全無參數等)上的傾斜。
不要忘了,如果你在web上下文中使用** static ** 這樣查詢就會編譯一次而不是每個請求 – nicolas