- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Entity Framework CodeFirst,其中我使用 ICollection 作为 Parent Child 关系
public class Person
{
public string UserName { get;set}
public ICollection<Blog> Blogs { get; set;}
}
public class Blog
{
public int id { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
好的,到目前为止一切正常,但我担心的是,每当我想获取某人的博客时,我都会将其作为
var thePerson = _context.Persons.Where(x => x.UserName = 'xxx').SingleOrDefault();
var theBlogs = thePerson.Blogs.OrderBy(id).Take(5);
现在,我明白了,当该行被执行时,那个人的所有博客都被加载到内存中,然后从内存中完成排序和选择。这对于拥有大量博客的 Person 的记录来说并不理想。我想将 Blog Child 设为 IQueryable,以便在拉入内存之前在 SQL 数据库中完成排序和选择。
我知道我可以在我的上下文中将博客声明为 IQueryable,这样我就可以直接查询为
var theBlogs = _context.Blogs.Where(.....)
但由于设计选择,这对我来说是不可行的,由于序列化问题,我想尽可能避免任何循环引用。因此,我没有在我的 child 中提及父实体。
我发现,我可以在博客上调用 AsQueryable() 方法
var theBlogs = thePerson.Blogs.AsQueryable().OrderBy(id).Take(5);
这对我来说就像一个魔法,好得令人难以置信。所以我的问题。这个 AsQueryable 是否真的使 ICollection 实际上成为 IQueryable 并使 SQL Server 中的所有查询过程(延迟加载)或者它只是像以前一样将博客加载到内存中的转换,但将接口(interface)从 ICollection 更改为 IQueryable ?
最佳答案
所以实际上看起来将您的导航属性写为 IQueryable<T>
is not possible .
您可以做的是将导航属性添加到 Blog
:
public class Blog
{
public int id { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
public virtual Person Owner { get; set; }
}
由此,您可以按如下方式查询,这样它就不会将所有内容都加载到内存中:
var thePerson = _context.Persons.Where(x => x.UserName = 'xxx').SingleOrDefault();
var results = _context.Blogs.Where(z => z.Person.Name = thePerson.Name).OrderBy(id).Take(5)
我建议你试试LINQPad查看 LINQ 如何转换为 SQL,以及从数据库实际请求的内容。
关于c# - ICollection 上的 AsQueryable() 真的可以延迟执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9191094/
我在使用 AsQueryable 时遇到问题,我发现了一些示例,其中此扩展需要强制转换,即 AsQueryable,在某些示例中,直接转换为 AsQueryable()。我用 Stopwatch 检查
也许这是个简单的问题,但是AsQueryable()有一些性能损失? 一般来说,我们正在使用 RavenDB,并且我们有这样的现有代码 protected override IQueryable Qu
我正在使用 mongoDB C# 驱动程序 2.4.0,当我尝试使用 LINQ 时出现错误: Method not found: 'MongoDB.Driver.Linq.IMongoQueryabl
AsQueryable() 的目的是为了让您可以将 IEnumerable 传递给可能需要 IQueryable 的方法,还是有一个将 IEnumerable 表示为 IQueryable 的有用理由
我是 mongodb 的新手,正在尝试在我的应用程序中使用 mongodb 实现存储库模式。所以我的问题是当我使用以下查询查询数据库时: _mongodb.GetCollection(typeof(T
示例代码: List Students = new List() { new Student(101, "Hugo", "Garcia", new List() { 91, 88, 7
我遇到了以 (...).ToList().AsQueryable() 结尾的 linq 查询。我知道分别使用 .ToList() 和 .AsQueryable() 。但是,如果两者结合,结果会怎样呢?
如果给定任何参数“名称”和“价格”或仅提供名称,我正在尝试让我的查询输出所有数据。我尝试使用 'Any' 参数,但它给了我 -- Cannot implicitly convert type 'boo
因此 IQueryable 允许您的查询在数据库级别执行,而不是像 IEnumerable 那样在内存中的对象集合上执行。如果我有一个 IEnumerable 并在其上调用 AsQueryable()
我在 C# 中使用最新的 ServiceStack OrmLite(当前为 v4.5.6) 我需要从一个方法返回 asQueryable,例如; using (IDbConnection da
我有一个通用字典,它传递给一个只接受 IQueryable 作为参数的方法 是否可以将可查询对象转换回原始字典?我并不是说用 .ToDictionary(...) 创建一个新字典 private st
我正在使用 Entity Framework CodeFirst,其中我使用 ICollection 作为 Parent Child 关系 public class Person { publi
我有两个模型,一个用户和一个团队,如下所示: [BsonRepresentation(BsonType.ObjectId)] public ObjectId _id { get; se
我开始使用存储库模式通过 Entity Framework 进行数据访问和 LINQ作为非测试存储库实现的基础。当调用返回 N 条记录而不是 List 时,我看到的大多数示例都会返回 AsQuerya
我知道第一个实现的 LINQ to Entities 和 LINQ to Objects 的一些区别 IQueryable和第二个工具 IEnumerable我的问题范围在 EF 5 之内。 我的问题
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个扩展方法可以对 IEnumerable 和 IQueryable 进行操作。该方法解析输入并在最后调用 Skip().Take()。 public static IEnumerable Sel
我正在尝试向 MongoDB 编写 LINQ 查询: using MongoDB.Driver; using MongoDB.Driver.Linq; namespace ConsoleApplica
案例 1:我在两个上下文中通过 ToList() 方法加入了两个不同的数据库上下文。 案例 2:并且还尝试使用 ToList() 加入第一个 Db 上下文,然后使用 AsQueryable() 加入第
我有这个 if 语句,它将结果作为 AsQueryable 返回到匿名类型: If (signature = "") Then testResults = (From
我是一名优秀的程序员,十分优秀!