Defaultifempty, похоже, работает в linq для объектов
-
21-09-2019 - |
Вопрос
Я новичок в linq и linq для сущностей, поэтому, возможно, я ошибся в своих предположениях, но я неосознанно пытался использовать DefaultIfEmpty в L2E.
По какой-то причине, если я превращу набор результатов в список, 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();
Решение
Это собирает способ больше данных, чем необходимо, потому что вы звоните .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
выбирает значение, возвращаемое запросом, и, если оно равно нулю или пусто, выбирает строку/объект, переданную в качестве параметра. "defaultpic.jpg"
в этом случае..First после этого предназначен для того, чтобы убедиться, что перечисление (которое, вероятно, всегда будет состоять только из одного элемента) свернуто в один экземпляр.