注意:这是在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
- 代码:fruit
,round
banana
- 代码:fruit
,long
如果对expectedTagIds
标记使用fruit
调用上述代码,则round
只返回apple
。
我设法修复了我的问题,并通过在调用上方添加以下行来使上述查询正常工作。
Task.WaitAll(_bagsContext.ProductTags.LoadAsync(), _bagsContext.Products.LoadAsync());
我有点理解为什么ProductTags
需要被引入,我假设LINQ to Entities没有深入到Where子句中以实现它需要标记时它编译查询。
但是,我无法理解为什么我需要在LoadAsync()
上致电Products
。 Products
是我要查询的表。