访问虚拟子对象执行没有WHERE子句的sql

时间:2017-03-30 01:09:08

标签: c# sql-server entity-framework linq-to-sql

我试图研究为什么,我认为应该是一个相对简单的概念,并没有按预期工作。从我所读到的内容中,以下以我期望的方式工作,但事实并非如此。

我正在使用实体框架从SQL数据库中检索数据,但是在访问子对象时我无法使Lazy / Deferred加载工作。

这是我的班级

public class Product 
{
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public string ShortDescription { get; set; }
        public string FullDescription { get; set; }
        public virtual IList<ProductEvent> Events { get; set; } = new List<ProductEvent>();
}

然后我将变量分配给产品

    var product = ServiceController.ProductService.GetProduct(123456);

和GetProduct方法:

    public Product GetProduct(int id, params Expression<Func<Product, object>>[] includedProperties)
    {
        IQueryable<Product> products = _db.Products;

        if (includedProperties != null)
        {
            foreach (var includeProperty in includedProperties)
            {
                products = products.Include(includeProperty);
            }
        }

        return products.Single(p => p.Id == id);
    }

当我调用方法并传入Product ID时,生成的SQL包含一个WHERE子句,如预期的那样。到目前为止,非常好。

当我尝试访问与此产品相关的事件子集时出现问题:

var desiredEvent = product.Events.SingleOrDefault(e => e.StartDateTime == '2017-07-01T02:00');

我希望生成的SQL包含WHERE子句,只返回具有匹配的StartDateTime的Events,但是SQL不包含任何WHERE子句,因此所有Product Events都被加载到内存中并在那里进行过滤。我的一些产品有超过100,000个事件,因此导致性能问题。

我无法理解在访问事件时导致我的过滤器被忽略的代码有什么问题。

我是否因为EF处理查询的方式而遗漏了一些基本内容?或者是我首先访问产品导致问题的方式?

0 个答案:

没有答案