使用AsNoTracking()报错:无法对ObjectQuery实例调用该方法
我在控制器中这样使用: ```csharp MyContext.Items.AsNoTracking().Where(i => i.ItemId == inputId && MyContext.FileAttachments.AsNoTracking.Where(f => f.RecordId == i.ReferenceId && f.RecordType == 'item').Any()).Any();
出现错误:
'Method 'System.Data.Entity.Infrastructure.DbQuery
1[Demo.FileAttachment] AsNoTracking()' declared on type 'System.Data.Entity.Infrastructure.DbQuery1[Demo.FileAttachment]' cannot be called with instance of type 'System.Data.Entity.Core.Objects.ObjectQuery`1[Demo.FileAttachment]''
我刚接触AsNoTracking(),请问我哪里出错了?
问题原因与解决方法
错误原因
- 类型不匹配:在EF中,当你在
Where的Lambda表达式内部访问MyContext.FileAttachments时,它会被解析为ObjectQuery<T>类型,而AsNoTracking()是DbQuery<T>的扩展方法,两者类型不兼容,导致调用失败。 - 语法错误:代码里的
AsNoTracking少了调用括号(),正确写法是AsNoTracking()。
解决方法
修正查询逻辑
不要在嵌套的Lambda内部直接访问上下文DbSet并调用AsNoTracking(),可以将嵌套的Any逻辑抽出来,调整写法:
MyContext.Items.AsNoTracking() .Where(i => i.ItemId == inputId) .Any(i => MyContext.FileAttachments.AsNoTracking() .Any(f => f.RecordId == i.ReferenceId && f.RecordType == 'item'));
更优方案(如果有导航属性)
如果Item和FileAttachment之间已经通过导航属性关联(比如Item里有ICollection<FileAttachment> FileAttachments),可以直接用导航属性查询,写法更简洁高效:
MyContext.Items.AsNoTracking() .Where(i => i.ItemId == inputId && i.FileAttachments.Any(f => f.RecordType == 'item')) .Any();
关于AsNoTracking()的注意点
- 该方法用于关闭EF的实体跟踪,适合只读场景,能提升查询性能。
- 它只能在
DbSet<T>或DbQuery<T>类型的对象上调用,不要在嵌套Lambda内部的上下文DbSet上使用,此时DbSet会被转换为ObjectQuery<T>,无法调用该扩展方法。
内容的提问来源于stack exchange,提问作者Suresh
相关产品推荐
相关产品推荐

