2012-08-29 72 views
2
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查詢的性能增益是多少?

回答

3

您將創建編譯查詢通過:

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()來加速原始查詢。

+0

不要忘了,如果你在web上下文中使用** static ** 這樣查詢就會編譯一次而不是每個請求 – nicolas

1

聲明你的編譯的查詢是這樣的:

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的應用程序中,則應考慮預編譯查詢並重新使用它們。

1

一個厚顏無恥的選擇將是:不涉及LINQ這樣一個微不足道但性能關鍵的操作。例如,用短小精悍點網:

string id = connection.Query<string>(
    @"select u_id from Users where u_id = @id", 
    new { id = Id }).SingleOrDefault(); 

從而徹底避免了所有的LINQ抽象,直接對數據庫(完全無參數等)上的傾斜。