在这样的LINQ to实体表达式中:
var vote = (from vote in db.Vote where
vote.Voter.Id == user.Id
select v).FirstOrDefault();
如何添加DefaultIfEmpty值,以便在没有投票时我会得到默认值?
答案 0 :(得分:18)
另一种方法,如果Vote
是引用类型,因此使用null作为其默认值,则使用null合并运算符:
var vote = (db.Vote
.Where(v => v.Voter.Id == user.Id)
.FirstOrDefault()) ?? defaultVote;
答案 1 :(得分:5)
添加您自己的扩展方法。例如:
public static class Extension
{
public static T FirstOrDefault(this IEnumerable<T> sequence, T defaultValue)
{
return sequence.Any() ? sequence.First() : defaultValue;
}
}
在范围内使用该类,您可以说:
var vote = (from vote in db.Vote where
vote.Voter.Id == user.Id
select v).FirstOrDefault(yourDefaultValue);
当然,你的方法也可以有一个返回默认值(T)的重载,如果那是你要找的地方。已经在内置的Extension类中定义了一个DefaultIfEmpty扩展方法,所以我在示例“FirstOrDefault”中命名了该方法,这似乎更合适。
答案 2 :(得分:4)
只需在获取第一个元素之前添加默认值。
var vote = db.Vote
.Where(v => v.Voter.Id == user.Id)
.DefaultIfEmpty(defaultVote)
.First();
请注意,您现在可以安全地使用First()
代替FirstOrDefault()
。
<强>更新强>
LINQ to Entity无法识别DefaultIfEmpty()
扩展方法。但是你可以使用空合并运算符。
var vote = db.Vote.FirstOrDefault(v => v.Voter.Id == user.Id) ?? defaultVote;
答案 3 :(得分:1)
我最终选择了一个非常简单的方法,这个方法在后面被删除的答案推荐:
var vote = (from vote in db.Vote
where vote.Voter.Id == user.Id
select v).FirstOrDefault();
if (vote == null) {
vote = new Vote() { .... };
db.AddToVoteSet(vote);
}
答案 4 :(得分:0)
由于某种原因,如果我将结果集转换为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();