我试图研究为什么,我认为应该是一个相对简单的概念,并没有按预期工作。从我所读到的内容中,以下应以我期望的方式工作,但事实并非如此。
我正在使用实体框架从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处理查询的方式而遗漏了一些基本内容?或者是我首先访问产品导致问题的方式?