linq如何实际执行代码以从数据源检索数据?

时间:2016-04-24 12:59:52

标签: c# linq

我将很快开始研究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过滤结果?或者使用我现有的设置实际执行

Select * from Customers where code = 'code1'

并将结果加载到对象?

提前感谢您提供的任何帮助

编辑:是的我知道有sqlite.net几乎可以做我的daos做但可能更好,并且在某些时候我可能会转换我的所有对象来使用它,我只需要知道为了知道

1 个答案:

答案 0 :(得分: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到EF,并且客户表有一百万行,您真的想要将它们全部带入内存中,然后将它们过滤掉以使用数据子集吗?完全过滤的查询通常会更好。