次のようなエンティティ式への LINQ では:
var vote = (from vote in db.Vote where
vote.Voter.Id == user.Id
select v).FirstOrDefault();
投票がないときにデフォルト値を取得するように、どのように DefaultIfEmpty 値を追加しますか?
次のようなエンティティ式への LINQ では:
var vote = (from vote in db.Vote where
vote.Voter.Id == user.Id
select v).FirstOrDefault();
投票がないときにデフォルト値を取得するように、どのように DefaultIfEmpty 値を追加しますか?
Vote
が参照型であり、デフォルト値として null を使用する場合、別のアプローチは、null 合体演算子を使用することです。
var vote = (db.Vote
.Where(v => v.Voter.Id == user.Id)
.FirstOrDefault()) ?? defaultVote;
独自の拡張メソッドを追加します。例えば:
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);
もちろん、それがあなたが探しているものである場合、あなたのメソッドはdefault(T)を返すオーバーロードを持つこともできます。組み込みのExtensionクラスにはすでにDefaultIfEmpty拡張メソッドが定義されているので、例の「FirstOrDefault」でメソッドに名前を付けました。これはより適切なようです。
最初の要素を取得する前にデフォルト値を追加するだけです。
var vote = db.Vote
.Where(v => v.Voter.Id == user.Id)
.DefaultIfEmpty(defaultVote)
.First();
First()
の代わりに安全に使用できるようになったことに注意してくださいFirstOrDefault()
。
アップデート
DefaultIfEmpty()
LINQ to Entity は拡張メソッドを認識しません。ただし、null 合体演算子を使用することもできます。
var vote = db.Vote.FirstOrDefault(v => v.Voter.Id == user.Id) ?? defaultVote;
私は非常に単純なアプローチを採用しましたが、これは後で消去された回答で推奨されていました。
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);
}
何らかの理由で、結果セットをリストに変換すると、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();