簡體   English   中英

更高效的Linq to SQL

[英]More efficient Linq to SQL

我一直在玩Linq to SQL來幫助我搜索一個簡單的數據庫。 數據庫由兩個表組成,即Player和Team,每個玩家記錄都有一個Team Id來鏈接兩個表(Player.TeamId - > Team.Id)。

為了增加一點復雜性,Team表包含過去10個賽季的歷史數據。 這意味着每個團隊在團隊表中最多可以有10個不同的記錄,與所代表的10個季節相關。

我希望我的查詢要做的是搜索一個播放器,該播放器返回符合搜索條件的玩家列表,以及該團隊每個返回玩家的隊友列表。

搜索條件包括Forname,Surname,(列表)季節和團隊名稱。

我的查詢如下所示:

using (var context = DataContextFactory.Context)
{
var playerList = context.GetTable<Player>(t =>  searchRequest.Seasons.Contains((int) t.Team.Season))
                              .Where(p => string.Equals(p.Surname, (searchRequest.Surname ?? p.Surname), StringComparison.OrdinalIgnoreCase) &&
                                          string.Equals(p.Forename, (searchRequest.Forename ?? p.Forename), StringComparison.OrdinalIgnoreCase) &&
                                          string.Equals(p.Team.Name, (searchRequest.TeamName ?? p.Team.Name), StringComparison.OrdinalIgnoreCase)
                                    )).ToList();

var teamMateList = new List<Player>();

foreach (var Player in playerList.Select(p => context.GetTable<Player>(
                              tm => tm.Team.Id == p.Team.Id && tm.Id.CompareTo(p.Id) != 0)))
{
    otherPeopleList.AddRange(people);
}
}

這將起作用並將返回與搜索條件匹配的玩家列表(playerList),並且對於每個玩家我可以從第二個查詢結果(teamMateList)映射他們的隊友。

我的問題是Linq to SQL將其轉換為非常低效的SQL。 第一個問題是它從數據庫中選擇了整個Player表 - 我認為這是因為Linq to SQL無法將我的Where子句轉換為標准SQL,因此返回整個表並在代碼中執行查詢的Where部分?

第二個問題是,在執行第二個查詢時,Linq to SQL會為playerList的每個成員生成對DB的單獨查詢。 在閱讀代碼時,這可能是有道理的,但我認為Linq會非常聰明地將其轉換為單個查詢,從而提高搜索效率。

有關如何簡化查詢的任何想法/建議?

我假設這是因為Linq to SQL無法將我的Where子句轉換為標准SQL,因此返回整個表並在代碼中執行查詢的Where部分?

或者,換句話說 - 因為你寫的條件忽略了LINQ可以翻譯的任何明智的方法。

string.Equals(p.Surname,(searchRequest.Surname ?? p.Surname

如果searchRequest.Surname為null,則不要選擇。

var query = context.GetTable<Player>(*first condition);

if (!string.IsNullOrEmpty(searchRequest.Surname) {
query = query.Where (x=> x.surname.StartsWIth (searchRequest.Surname);
}

沒有人說你必須在一次運行中定義整個LINQ部分。 在編寫手動SQL時這很糟糕,LINQ很糟糕。 顯式支持LINQ表達式,其中結果再次為IQueryable並且鏈接為此類鏈接。 我們在數億行上做了高效的LINQ,它看起來很棒 - 但這只是因為我們不會以那么糟糕的方式編寫代碼。

您的第二個問題是相同的 - 您通過強制 LINQ使用低效的搜索模式從錯誤的方面解決問題。 使用group by進行選擇,然后將客戶端與另一個表連接。

LINQPad可以幫助您在本地調試LINQ語句。

您還可以在調試LINQ to SQL查詢時使用SQL Server Profiler ,它不僅會向您顯示.NET正在將查詢轉換為什么,而且還會向您顯示在數據庫中拋出的所有其他內容。 當嘗試使用LINQ查詢來翻譯可笑的長等效SQL查詢時,這也非常有用。

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM