Defaultifempty似乎适用于linq实体

时间:2010-03-21 11:04:17

标签: linq-to-entities defaultifempty

我是linq和linq的新手,因此我的假设可能出错了,但我一直在不知不觉中尝试在L2E中使用DefaultIfEmpty。

由于某种原因,如果我将结果集转换为List,则Defaultifempty()有效,我不知道是否我无意中越过了Linq区域。下面的代码有效,任何人都可以告诉我为什么?如果它确实有效,那么它对其他人有帮助。

var results = (from u in rv.tbl_user
              .Include("tbl_pics")
              .Include("tbl_area")
              .Include("tbl_province")
              .ToList()
              where u.tbl_province.idtbl_Province == prov
              select new { u.firstName, u.cellNumber,
                  u.tbl_area.Area, u.ID,u.tbl_province.Province_desc,
                  pic = (from p3 in u.tbl_pics
                        where p3.tbl_user.ID == u.ID
                        select p3.pic_path).DefaultIfEmpty("defaultpic.jpg").First())
                  }
              ).ToList(); 

1 个答案:

答案 0 :(得分:2)

这会收集 way 超出必要的数据,因为您在没有过滤的情况下调用.ToList()。这意味着您从数据库中选择所有

相反,请考虑一下:

var results = (from u in rv.tbl_user 
               where u.tbl_province.idtbl_Province == prov 
               select new { 
                   u.firstName, 
                   u.cellNumber, 
                   u.tbl_area.Area,
                   u.ID,
                   u.tbl_province.Province_desc, 
                   pic = (from p3 in u.tbl_pics 
                          where p3.tbl_user.ID == u.ID 
                          select p3.pic_path).DefaultIfEmpty("defaultpic.jpg").First() 
               }).ToList();

要回答您的问题,.DefaultIfEmpty选择查询返回的值,如果它为null或为空,则选择作为参数传入的字符串/对象。在这种情况下"defaultpic.jpg"。之后的第一步是确保枚举(可能只包含一个元素)被折叠为单个实例。