我如何知道将执行以下哪些linq查询?
// I think this will not be executed
var temp1 = PdvEntities.Entities.Products;
// Not sure
IEnumerable<Data.Products> temp2 = PdvEntities.Entities.Products;
// will not be executed
var temp3 = from a in PdvEntities.Entities.Products select a;
ListView lv1 = new ListView();
lv1.DataContext = temp1; // will this make the first query to be executed?
lv1.ItemsSource = temp2; // will this make the second query execute?
// I think this will be executed
var temp4 = PdvEntities.Entities.Products.ToList();
注意我正在使用ADO.Net实体数据模型从我的数据库中的表Products中执行查询
答案 0 :(得分:2)
这个概念被称为“延迟执行”,一般的经验法则是,在您实际访问基础数据之前,不会执行查询。考虑它的另一种方法是,当你不再返回IEnumerable
或IQueryable
时,你可能正在执行代码,就像你上一个temp4正在放入一个List<T>
这肯定是访问数据。
这是一个不错的解释:
答案 1 :(得分:1)
temp2
。
temp1
。
答案 2 :(得分:1)
对于DataContext,它实际上取决于你用它做什么。如果您从不枚举集合,则永远不会执行查询。对于ItemsSource,我相信它会在您分配它时枚举它,以便在列表视图中创建必要的对象,只要它向用户显示即可。如果没有显示,我认为不会执行查询。简单的方法是模拟一些真正快速的东西,这些东西可以放在代码示例中,然后在Visual Studio中逐步完成。这样,您可以在之后检查您的本地窗口以查看该集合是否已填写。
答案 3 :(得分:0)
只有最后一个,因为我没有看到你将ListView添加到UI。
DataContext只是一个对象类型,所以它只是获取对IEnumerable的引用。 ItemsSourceProperty 是一个IEnumrable,以便一个引用您的IEnumerable。 您将看到(实现)IEnumerable的结果的唯一方法是访问数据时。