13

次のようなエンティティ式への LINQ では:

var vote = (from vote in db.Vote where
    vote.Voter.Id == user.Id
    select v).FirstOrDefault();

投票がないときにデフォルト値を取得するように、どのように DefaultIfEmpty 値を追加しますか?

4

5 に答える 5

19

Voteが参照型であり、デフォルト値として null を使用する場合、別のアプローチは、null 合体演算子を使用することです。

var vote = (db.Vote
   .Where(v => v.Voter.Id == user.Id)
   .FirstOrDefault()) ?? defaultVote;
于 2009-07-14T18:32:31.583 に答える
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);

もちろん、それがあなたが探しているものである場合、あなたのメソッドはdefault(T)を返すオーバーロードを持つこともできます。組み込みのExtensionクラスにはすでにDefaultIfEmpty拡張メソッドが定義されているので、例の「FirstOrDefault」でメソッドに名前を付けました。これはより適切なようです。

于 2009-07-14T18:14:29.077 に答える
4

最初の要素を取得する前にデフォルト値を追加するだけです。

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;
于 2009-07-14T18:25:15.403 に答える
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);
}
于 2009-07-15T05:36:05.977 に答える
0

何らかの理由で、結果セットをリストに変換すると、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();
于 2010-03-21T10:28:13.147 に答える