使用LINQ减少SQL查询以进行“每记录”查找

时间:2012-04-20 10:07:34

标签: c# sql performance linq linq-to-sql

首先,如果标题具有误导性,请对不起,如果需要可以随时更改。

我在C#asp.net MVC 3 Web应用程序中使用LINQ to SQL,其中一个功能是查询“Users”的集合。在使用数据之前应用过滤,排序和分页。这一部分都很好,所有这些都是有条理的,所以在这个阶段只执行一个SQL查询(LINQ的这个帽子)。

但是,我所拥有的是每个“用户”都有许多关联的表(即地址,电子邮件,号码),其中用户可以拥有一个或多个。现在,为了我的功能,我需要收集每个相关表中的第一个条目(即“主要”记录)。我对此编码的方式是,对于“过滤”部分中找到的每条记录,都有一个单独的查询来提取每个主要详细记录。

我相信在这一点上你们都知道我要去哪里:我可以在不影响代码结构的情况下减少查询次数吗?

那么,下一部分,我的代码是什么样的......

(请记住这是对这个问题的总结,可能会也可能不会编译/运行)

IQueryable<Data.User> users = GetUsers();

users = ApplyFilterSortingPaging(users);//nothing actually executed yet, still building the IQueryable

List<Models.User> results = users.Select(x => x.ToModel());

现在您将要查看ToModel扩展方法...

public static Models.User ToModel(this Data.User user)
{
    Models.User result = new Models.User()
    {
       Name = user.Name,
       PrimaryAddress = user.Addresses.First(),
       PrimaryEmail = user.Emails.First(),
       PrimaryNumber = user.Numbers.First()
    };
}

正如您所料,对于每个联系人记录,我现在还有3个查询正在运行。总的来说,性能不是问题(至少在目前) - 它的速度非常快。 我能做些什么来将每个记录减少到一个查询?甚至只是一个主要的“获取所有过滤的记录+额外的数据”查询?

也许这是更易读/可重用的代码的成本?

1 个答案:

答案 0 :(得分:1)

您可以在数据库中创建所需数据的视图,然后使用LINQ进行查询。