我一直在使用Linq to SQL帮助我搜索简单的数据库。该数据库由两个表Player和Team组成,每个球员记录都有一个Team Id来链接(Player.TeamId -> Team.Id)这两个表。
为了增加一些复杂性,Team表包含过去10个赛季的历史数据。这意味着每个Team可能在Team表中具有高达10个不同的记录,与所代表的10个赛季相关。
我的查询要做的是搜索符合搜索条件的球员并返回该团队的每个返回球员的队友列表,以及当时的季节。
搜索条件包括名字,姓氏,季节列表和团队名称。
我的查询如下:
为了增加一些复杂性,Team表包含过去10个赛季的历史数据。这意味着每个Team可能在Team表中具有高达10个不同的记录,与所代表的10个赛季相关。
我的查询要做的是搜索符合搜索条件的球员并返回该团队的每个返回球员的队友列表,以及当时的季节。
搜索条件包括名字,姓氏,季节列表和团队名称。
我的查询如下:
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的每个成员生成单独的查询。阅读代码时,这可能是有道理的,但我认为Linq应该足够聪明,将其转换为单个查询以实现更高效的搜索。
您对如何简化我的查询有什么想法/建议吗?
==
而不是StringComparison.OrdinalIgnoreCase
,并让数据库处理校对,情况是否会有所改善? - Dervall