为什么我需要在查询之前调用LoadAsync?

时间:2016-04-25 07:42:24

标签: entity-framework linq-to-entities entity-framework-core dnx

注意:这是在DNX上运行的Entity Framework 7 / Entity Framework Core。

我有以下两种模式:

public class ProductTag
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public Guid TagId { get; set; }
    public Tag Tag { get; set; }
    [Required]
    public Guid ProductId { get; set; }
    public Product Product { get; set; }
}

public class Product
{
    [Key]
    public Guid Id { get; set; }

    [Required]
    public String Name { get; set; }
    [Required]
    public UInt32 Price { get; set; }

    public List<ProductTag> Tags { get; set; } = new List<ProductTag>();
}

当我尝试执行以下查询时,无法找到任何匹配项:

await _bagsContext.Products
    .Where(product => expectedTagIds
        .All(expectedTagId => product.Tags
            .Select(productTag => productTag.TagId)
            .Contains(expectedTagId)))
    .ToListAsync();

注意:当我运行以下查询时,我会得到完整的结果,包括标签!

await _bagsContext.Products.ToListAsync()

这表明它是具体的Where子句,没有填充必要的东西。也许这是在查询产品数据库之前在客户端执行的Where子句中的问题(如评论中所建议的)。

查询的目标是返回每个 expectedTagId的产品列表。

举一个简单的例子,拿两个产品

  • apple - 代码:fruitround
  • banana - 代码:fruitlong

如果对expectedTagIds标记使用fruit调用上述代码,则round只返回apple

我设法修复了我的问题,并通过在调用上方添加以下行来使上述查询正常工作。

Task.WaitAll(_bagsContext.ProductTags.LoadAsync(), _bagsContext.Products.LoadAsync());

有点理解为什么ProductTags需要被引入,我假设LINQ to Entities没有深入到Where子句中以实现它需要标记时它编译查询。

但是,我无法理解为什么我需要在LoadAsync()上致电ProductsProducts是我要查询的表。

0 个答案:

没有答案