Pregunta

En un LINQ a las entidades de expresión como esta:

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

¿Cómo agregar un valor DefaultIfEmpty de manera que cuando no hay voto que tendría un valor por defecto?

¿Fue útil?

Solución 4

Terminé yendo de un enfoque muy simple que fue recomendado por una respuesta aquí que este último fue borrado:

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

Otros consejos

Otro enfoque, si Vote es un tipo de referencia y por lo tanto utiliza null como su valor predeterminado, sería utilizar el operador coalescente null:

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

Añada su propio método de extensión. Por ejemplo:

public static class Extension
{
    public static T FirstOrDefault(this IEnumerable<T> sequence, T defaultValue)
    { 
        return sequence.Any() ? sequence.First() : defaultValue;
    }
}

Con esa clase de alcance, se puede decir:

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

Por supuesto, el método también puede tener una sobrecarga que devuelve predeterminado (T), si eso era lo que buscabas. No hay definido un método de extensión DefaultIfEmpty en la clase incorporada de extensión, por lo que he llamado el método en el ejemplo "FirstOrDefault", lo que parece un mejor ajuste.

Sólo tiene que añadir el valor predeterminado antes de conseguir el primer elemento.

var vote = db.Vote
    .Where(v => v.Voter.Id == user.Id)
    .DefaultIfEmpty(defaultVote)
    .First();

Tenga en cuenta que ahora se puede utilizar con seguridad en lugar de First() FirstOrDefault().

Actualizar

LINQ a la entidad no reconoce el método de extensión DefaultIfEmpty(). Pero sólo se puede utilizar el operador coalescente nula.

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

Por alguna razón, si a su vez el conjunto de resultados en una lista, el DefaultIfEmpty () funciona No sé si me he cruzado inadvertidamente encima en el área de 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top