我是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();
答案 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"
。之后的第一步是确保枚举(可能只包含一个元素)被折叠为单个实例。