1

我有一个包含很多包含的查询,我想知道我是否可以对一些包含进行拍摄。

例如,这是我的一个查询,其中(非法)Take 说明了我想要做什么。

var primaryLocation = context.Locations
                .Include("PhoneNumbers")
                .Include("Invoices").Take(50)
                .Include("Invoices.Items")
                .Include("Schedules")
                .Include("Staffs")
                .SingleOrDefault(d => d.Id == locationId);

目前我能想到的唯一方法是这样的:

var primaryLocation = context.Locations
                .Include("Invoices")
                .Include("Etc")
                .SingleOrDefault(d => d.Id == locationId);

primaryLocation.Invoices = primaryLocation.Invoices.Take(50).ToList();

我不想那样做,因为这意味着从数据库中拉回整个 Invoice 列表,而我不需要。

有没有一种方便的方法可以将 Take 构建到我的查询中?

4

2 回答 2

0

似乎对您正在做的事情有两个相互矛盾的标准。我猜在这里,但你并没有让我们这么多继续下去。

由于您的primaryLocation.Invoices = primaryLocation.Invoices.Take(50).ToList();陈述仅使用了您的 1 个包含项,因此我假设您使用您的内容做的事情primaryLocation比您向我们展示的要多。这使我相信您希望该 primaryLocation 包含所有内容。然后你似乎不想要超过这 50 个,所以这并不是所有的东西……对我来说这是一个矛盾。如果您需要全部,则应将其全部包含在内。

如果您想要专门选择 50 张发票,您可以在其自己的查询中单独获取这些发票。我自己使用 NHibernate,所以我不确定未来在实体框架中的语法,但是如果你想通过只有 1 次往返服务器来请求多个东西,在 NHibernate 中你可以对未来进行一系列查询允许这样做。我希望实体框架有类似的东西。

简而言之,我的建议是,如果您希望 primaryLocation 包含您的所有数据,那么这就是您将得到的,如果您使用像 Take 这样的过滤器获取更具体的信息,那么您可能想要查询更多具体来说。

于 2013-09-15T23:04:18.553 回答
0

Include如果您不想要所有内容,请使用投影而不是盲目调用:

var primaryLocation = context.Locations
    .Select(location => new {
        Id = location.Id,
        Name = location.Name,
        // ... other properties needed on the front end
        RecentInvoices = location.Invoices
            // really should sort if you're only taking 50
            .OrderByDescending(invoice => invoice.CreatedAt)
            .Take(50),
        AllPhoneNumbers = location.PhoneNumbers,
    })
    .SingleOrDefault(location => location.Id == locationId);

您也可以使用投影来获取您需要的发票信息,我只是不想使示例过于复杂。

使用这种方法,您可以准确地获得所需的数据,而不会增加混乱。它还允许您命名您的属性(例如RecentInvoices上面的)以添加更多含义。

于 2013-09-16T04:10:41.537 回答