将执行以下哪个linq查询

时间:2012-03-13 16:48:41

标签: c# linq ado.net

我如何知道将执行以下哪些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中执行查询

4 个答案:

答案 0 :(得分:2)

这个概念被称为“延迟执行”,一般的经验法则是,在您实际访问基础数据之前,不会执行查询。考虑它的另一种方法是,当你不再返回IEnumerableIQueryable时,你可能正在执行代码,就像你上一个temp4正在放入一个List<T>这肯定是访问数据。

这是一个不错的解释:

http://www.codeguru.com/columns/vb/article.php/c16935

答案 1 :(得分:1)

当UI更新列表视图时,将评估

temp2

除非您对ListView的DataContext具有绑定,否则永远不会评估

temp1

答案 2 :(得分:1)

对于DataContext,它实际上取决于你用它做什么。如果您从不枚举集合,则永远不会执行查询。对于ItemsSource,我相信它会在您分配它时枚举它,以便在列表视图中创建必要的对象,只要它向用户显示即可。如果没有显示,我认为不会执行查询。简单的方法是模拟一些真正快速的东西,这些东西可以放在代码示例中,然后在Visual Studio中逐步完成。这样,您可以在之后检查您的本地窗口以查看该集合是否已填写。

答案 3 :(得分:0)

只有最后一个,因为我没有看到你将ListView添加到UI。

DataContext只是一个对象类型,所以它只是获取对IEnumerable的引用。 ItemsSourceProperty 一个IEnumrable,以便一个引用您的IEnumerable。 您将看到(实现)IEnumerable的结果的唯一方法是访问数据时。

另见IEnumerable vs List - What to Use? How do they work?