gpt4 book ai didi

c# - Linq 和 IEnumerable 惰性查询。效率损失?

转载 作者:行者123 更新时间:2023-12-02 22:17:17 34 4
gpt4 key购买 nike

我一直在读到 Ienumerables 不会立即运行。所以我试图找到查询列表的最佳方法。

下面是我的 getAll 方法。其次是我的过滤方法。后跟首选过滤方法(可读性)。

我的问题是,第三种方法和直接查询一样吗?换句话说,它会还是不会从数据库中加载所有 myObjects 然后进行过滤?或者在从数据库获取时进行过滤。

   public static IEnumerable<myObject> getAll()
{
using (var db = Database.OpenConnectionString(blahblah))
{
var queryResults = db.Query("SELECT * FROM vu_myObjects");

return queryResults .Select(x => new myObject(x.myObjectName, x.myObjectF));
}
}

public static IEnumerable<myObject> getAllForFilter(String filter)
{
using (var db = Database.OpenConnectionString(blahblah))
{
var queryResults = db.Query("SELECT * FROM vu_myObjects WHERE ObjectF = @0", filter);

return queryResults.Select(x => new myObject(x.myObjectName, x.ObjectF));
}
}

public static IEnumerable<myObject> getAllForFilter(String filter)
{ // Not checked syntax.
return getAll().Where(x => x.ObjectF = filter);
}

或者,如果您有更好的建议,我会洗耳恭听。

最佳答案

will it, or wont it Load ALL myObjects from the DB and then filter?

不会因为您还没有实际查询数据库。 IQueryable<T>已延迟执行,因此为了实际返回结果集,您需要执行查询。这可以通过几种方式完成,例如打电话ToList或迭代列表。

任何过滤,即您的 Where子句,将在数据库端完成。

实际上,您目前拥有的代码甚至无法工作 - 它会抛出 ObjectDisposedException因为您正试图在处理数据上下文之后对延迟查询应用过滤器。为了使您的代码正常工作,您需要传入 where子句作为 getAll 的参数方法例如

public static IEnumerable<myObject> getAll(Expression<Func<myObject,bool>> where)
{
using (var db = Database.OpenConnectionString(blahblah))
{
var queryResults = db.Query("SELECT * FROM vu_myObjects");
if (where != null)
{
queryResults.Where(where);
}
return queryResults .Select(x => new myObject(x.myObjectName, x.myObjectF));
}
}

public static IEnumerable<myObject> getAllForFilter(String filter)
{ // Not checked syntax.
return getAll(x => x.ObjectF = filter);
}

更新

正如您刚才指出的,您正在使用 WebMatrix.Database以上都不适用,因为这里没有延迟执行。 Query方法立即执行并返回 IEnumerable<T> 的结果集所以任何过滤应用后记将在内存中完成。因此,就效率而言,第一种过滤方法会更好,因为它在 DB 端完成所有工作。

您可以通过转换 Where 来获得可读性和效率。子句添加到实际字符串并将其附加到您的查询。

关于c# - Linq 和 IEnumerable 惰性查询。效率损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14256764/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com