1

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

出于某种原因,如果我将结果集变成一个列表, 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(); 
4

1 回答 1

2

这会收集比必要更多的数据,因为您在没有.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"在这种情况下。之后的 .First 只是为了确保枚举(可能总是只包含一个元素)被折叠到一个实例中。

于 2010-03-21T11:13:47.200 回答