LINQ实际上是如何执行从数据源检索数据的代码?

6

我很快就要开始使用Xamarin,并将大量代码从Android Studio的Java转换为C#。

在Java中,我使用自定义类,给定参数条件等,将它们转换为SQL语句,然后将结果加载到项目模型中的对象中。

我不确定是否使用LINQ更好地过滤这些数据。

例如,目前会发生类似以下情况的事情:

List<Customer> customers = (new CustomerDAO()).get_all()

或者如果我有一个条件

List<Customer> customers = (new CustomerDAO()).get(new Condition(CustomerDAO.Code, equals, "code1")

现在假设我已经将类转移到C#中,并且我希望做类似于第二种情况的事情。
那么我可能会写出以下代码:
var customers = from customer 
    in (new CustomerDAO()).get_all() 
    where customer.code.equals("code1")
    select customer

我知道只有在尝试访问客户时才会执行查询,但是如果我对客户进行多次访问(假设我稍后使用4个foreach循环),get_all方法会被调用4次吗?还是结果会在第一次执行时存储起来?

另外,仅保留get_all()方法并使用linq过滤结果是否更有效(时间方面,因为内存方面可能不是)?还是使用我现有的设置,实际上执行了xx?

Select * from Customers where code = 'code1'

将结果加载到对象中?

非常感谢您提供的任何帮助。

编辑:是的,我知道有sqlite.net可以做我dao所做的事情,但可能更好,而且在某些时候我可能会转换所有对象以使用它,我只需要了解这个问题。


你指的是哪种 LINQ?LINQ to objects?LINQ to EF?还是 LINQ to SQL? - Yuval Itzchakov
是的,DAO 创建 List<T>。 - Cruces
1个回答

4
如果我对客户有多个访问(假设我之后使用了4个foreach循环),那么get_all方法会被调用4次吗?还是结果在第一次执行时就被存储了?
每次枚举枚举器(在您的示例中使用foreach)时,查询将重新执行,除非您将材料化的结果存储在某个地方。例如,如果在第一次查询中您执行以下操作:
var customerSource = new CustomerDAO();
List<Customer> customerSource.Where(customer => customer.Code.Equals("code1")).ToList();

那么现在您将使用内存中的List<Customer>而不会再次执行查询。

相反,如果每次都执行以下操作:

var filteredCustomers = customerSource.Where(customer => customer.Code.Equals("code1"))
foreach (var customer in filteredCustomers)
{
    // Do stuff
}

然后对于每个枚举,您将再次执行上述查询。

另外,从时间的角度来看(因为在内存方面可能不是这样),保持get_all()方法并使用linq过滤结果是否更有效?还是使用现有的设置,实际上执行了

这实际上取决于您的用例。假设您正在使用LINQ to EF,并且客户表具有一百万行数据,您真的想将所有数据都带入内存中,然后仅将它们过滤出来以使用子集数据吗?通常最好全面过滤查询。


1
所以要么在需要结果之前只执行一次该过程,要么每次需要时都执行它,我必须在性能和内存使用之间做出选择,感谢您的答案。 - Cruces
@Cruces 这并不是那么容易和简单的 - 除非你对数据库的作用一无所知。如果你有6400万个客户,并且按名称查找,服务器上的表具有名称索引,那么询问数据库服务器可能比沿着数组运行更快。实现自己的内存数据库与仅在内存集合上运行LINQ to Objects非常不同。因此,权衡并不像你所想的那样微不足道。另外,那些客户的更新怎么办?如何重新加载它们? ;) - TomTom
不,我不会处理那么大的数据库,大多数表格的条目都不超过400k,但我明白你的意思,当有太多行时,我通常会分页数据。我只是在想,当我必须搜索某些我知道大小的东西时会产生什么影响(例如我的邮政编码表大约有100个条目,可能永远不会超过200个)。我通常使用这些数据的原型,我只是在想是否最好立即加载它们,因为即使原型模式也存在一些问题。 - Cruces
关于更新和修改,我主要从事移动应用开发,所以大部分时间我不需要担心有人会更改我的数据库中的数据。我有一个与中央数据库同步的过程,并且只与本地数据库进行交互。 - Cruces

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接