Как вернуть значение по умолчанию, если запрос LINQ toentities не возвращает значений?

StackOverflow https://stackoverflow.com/questions/1127054

Вопрос

В выражении LINQ toentities вроде этого:

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

Как добавить значение DefaultIfEmpty, чтобы при отсутствии голосования я получал значение по умолчанию?

Это было полезно?

Решение 4

В итоге я выбрал очень простой подход, рекомендованный здесь ответом, который позже был стерт:

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);
}

Другие советы

Другой подход, если 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().

ОБНОВЛЯТЬ

LINQ to Entity не распознает DefaultIfEmpty() метод расширения.Но вы можете просто использовать нулевой оператор объединения.

var vote = db.Vote.FirstOrDefault(v => v.Voter.Id == user.Id) ?? defaultVote;

По какой-то причине, если я превращу набор результатов в список, 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top