林克在幕后

时间:2010-12-09 12:06:21

标签: c# .net linq linq-to-sql linq-to-entities

我非常感谢详细解释(以及如果)以下Linq与实体相关的代码片段在幕后发生的情况有所不同: 答:“foreach”循环在“使用”子句中 B.而不是Linq to Entites我使用了一个在Linq上运行查询到sql的silimilar映射 C. A + B。

代码:

 ILookup<string, tblProduct> productBooks;
        using (TbsDBEntities tbsDbEntities = new TbsDBEntities())
        {
            productBooks = (from tbsDbEntity in tbsDbEntities.tblProducts
                            orderby tbsDbEntity.Title
                            select tbsDbEntity).ToLookup(p => p.Title.Substring(0, 1).ToUpper());

        }


        foreach (IGrouping<string, tblProduct> productBook in productBooks)
        {
            if (productBook.Key[0] >= 'A' && productBook.Key[0] <= 'Z')
            {
                HtmlAnchor anchor = new HtmlAnchor();
                anchor.InnerText = productBook.Key+"    ";
                anchor.HRef ="/"+ productBook.Key;
                divHeader.Controls.Add(anchor);
            }

2 个答案:

答案 0 :(得分:0)

幕后: 代码通过实体映射访问产品的数据库列表。通常会将ADO.NET Entity framework + Linq的代码写入实体。

代码使用linq提取数据行而不是使用典型的SQL查询,例如“select * from products”..实体映射有望在幕后生成查询并获取数据..如果你有像sql profiler那样的话工具,您将能够看到代码传递给sql server的查询。

foreach通常为linq语句返回的每个产品创建链接...并在其中添加链接..一个if语句可能保护代码免受不以字母字符开头的产品名称的影响。所以可能检查&gt; = A和&lt; = Z


一个。不应该有区别。

B中。如果tblProducts有大量数据,你可能会有一个体贴的性能提升..因为linq-to-database有助于避免构建所有数据的实体对象。

℃。与B相同...因为我认为在'使用'中使用for循环不会使它有任何不同

答案 1 :(得分:0)

我仔细研究了这一点,并在using关闭后认为“那将无效”。

然而,ToLookup()实际上执行了SQL语句,所以这一切都很好。将它留作IEnumerable将导致它在你的第二个foreach中失败,因为上下文将被处理掉。使用此代码可以使用Linq to SQL。