Linq +实体框架仅选择某些子记录

时间:2014-05-11 05:04:19

标签: c# linq entity-framework

我正在尝试使用Linq和Entity Framework实现某些功能。我想要达到的目标与这个问题完全相同:

LINQ: dot notation equivalent for JOIN

在我的情况下,虽然我想加载客户和相关的发票,但只加载某些发票,而不是所有发票。

我试图在上面的链接中实现给定的答案,但我的发票是空的。

    public IEnumerable<Customer> GetAllCustomers()
    {
        List<Customer> customers;

        using (var context = new EfContext())
        {
            customers = context.Customers.Join
                (
                    context.Invoices,
                    c => c.Id,
                    i => i.CustomerId, (c, i) => new { c, i }
                ).Where(z => z.i.Id > 3)
                .Select(z => z.c).ToList();
        }

        return customers;
    }

Schema

这似乎有效,只需要仔细检查一下:

    public Customer GetCustomer(int id)
    {
        Customer customer;

        using (var context = new EfContext())
        {
            customer = context.Customers.Where(c => c.Id == id)
                .Select(c => new
                {
                    c,
                    Invoices = c.Invoices.Where(i => i.Id > 0 && i.Lines.Any(li => li.Item == "Bacon"))
                    .ToList().Select(z => new { z, Lines = z.Lines.Where(l => l.Item == "Bacon")}).ToList()
                })
                .ToList()
                .Select(x => x.c)
                .FirstOrDefault();
        }

        return customer;
    }

1 个答案:

答案 0 :(得分:0)

这可能与实体&#34; load&#34;的问题。
当您使用实体框架时,您可以将其配置为在每个查询中加载所有相关实体(例如,当您查询客户并查找相关发票时,也可以将其带入,并且如果您不这样做,您可以告诉他明确地执行此操作39;我希望他默认这样做。)

检查此article并确定是否需要急切\ lazy \ explicit loading: