C# 访问实体框架';s包括方法

C# 访问实体框架';s包括方法,c#,linq,entity-framework,C#,Linq,Entity Framework,我试图使用QueryResultCache类访问实体框架的Include方法,该类是。这是一篇非常流行的文章,很多查询缓存库都在使用它。 当我尝试这样的表达时: var exp1 = context.Products.Include(x => x.Tags) .Where(x => x.Tags.Any(y => y.Name.Contains("Test"))) .Select(x => new

我试图使用
QueryResultCache
类访问实体框架的Include方法,该类是。这是一篇非常流行的文章,很多查询缓存库都在使用它。 当我尝试这样的表达时:

var exp1 = context.Products.Include(x => x.Tags)
                   .Where(x => x.Tags.Any(y => y.Name.Contains("Test")))
                   .Select(x => new {x.ProductId}).Expression;
使用它,它将生成以下字符串:

value(System.Data.Entity.Core.Objects.ObjectQuery`1
[EfSecondLevelCaching.Test.Models.Product]).MergeAs(AppendOnly).IncludeSpan
(value(System.Data.Entity.Core.Objects.Span))
.Where(x => x.Tags.Any(y => y.Name.Contains("Test")))
.Select(x => new <>f__AnonymousType5`1(ProductId = x.ProductId))

因此,这里的
Include(x=>x.Tags)
Include(x=>x.Users)

查询将只返回Select表达式中的内容。在这种情况下,
Select(x=>new{x.ProductId})
意味着只返回单个字段
ProductId

如果您返回的
产品包含
标签,则您的
包含
会有所不同,但如果您只有
产品ID
,则不会有任何不同


有关快速加载的更多信息,请参见(
Include
确保快速加载)

这只是一个想法,但您可以在最后的选择中包含“Tags”属性。所以您有.Select(x=>new{x.ProductId,x.Tags})@MohesnKahn正如Andy在回答中所说的,试一下context.Products.Include(x=>x.Tags).Where(x=>x.Tags.Any(y=>y.Name.Contains(“Test”)).Expression;这完全有道理。这是真的,但这只是一个例子来说明这个概念。删除选择方法不会更改
IncludeSpan
部件。
value(System.Data.Entity.Core.Objects.ObjectQuery`1
[EfSecondLevelCaching.Test.Models.Product])
    .MergeAs(AppendOnly)
    .IncludeSpan(value(System.Data.Entity.Core.Objects.Span))
    .Where(x => x.Tags.Any(y => y.Name.Contains("Test")))