我将很快开始研究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做但可能更好,并且在某些时候我可能会转换我的所有对象来使用它,我只需要知道为了知道
答案 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,并且客户表有一百万行,您真的想要将它们全部带入内存中,然后将它们过滤掉以使用数据子集吗?完全过滤的查询通常会更好。