2009-07-14 20 views

Antwort

1

landete ich für einen sehr einfachen Ansatz geht die durch eine Antwort wurde hier empfohlen, dass letztere gelöscht war:

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

FYI, das hat deine ursprüngliche Frage nicht befriedigt. Sie haben explizit darum gebeten, dass ein Standardwert zurückgegeben wird und kein neuer Wert erstellt wird, wenn dieser nicht bereits existiert. (Das ist feiner Code, tut einfach nicht, was Sie gefragt haben.) – BenSwayne

5

Fügen Sie Ihre eigene Erweiterungsmethode hinzu. Zum Beispiel:

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

Mit dieser Klasse in Umfang, können Sie sagen:

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

Natürlich können Sie Ihre Methode auch eine Überlastung, die Standard (T) zurückgibt, wenn das war, was man wo Auf der Suche nach. Es ist bereits eine DefaultIfEmpty-Erweiterungsmethode in der integrierten Extension-Klasse definiert, daher habe ich die Methode im Beispiel "FirstOrDefault" benannt, die besser passt.

+0

DefaultIfEmpty() existiert bereits als Erweiterung Methode :) http://msdn.microsoft.com/en-us/library/bb355419.aspx –

+0

Du hast Recht, ich das Beispiel bearbeitet ein verwenden besserer Name. – driis

+0

Warum sollte ich einen FirstOrDefault neu schreiben, wenn es bereits einen für diesen Zweck entwickelt hat? – Pablo

3

Fügen Sie einfach den Standardwert hinzu, bevor Sie das erste Element abrufen.

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

Beachten Sie, dass Sie jetzt First() sicher statt FirstOrDefault() verwenden können.

UPDATE

LINQ to Entity erkennt nicht die DefaultIfEmpty() Erweiterungsmethode. Aber Sie können einfach den Nullkoaleszenzoperator verwenden.

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

Wenn beim Hinzufügen eines Standards Sie First verwenden können, warum existiert FirstOrDefault überhaupt? – Pablo

+0

Viele der LINQ-Operatoren sind etwas redundant - sequence.Any() kann als sequence.Count()> 0 umgeschrieben werden. Sie können sequence.Where (item => Condition (item)). First() oder sequence.first (Artikel => Zustand (Artikel)). Sie können Joins oder verschachtelte Abfragen verwenden. Wenn Sie Code schreiben, können Sie For-, Do- und While-Schleifen verwenden. Sie können sogar goto verwenden. Normalerweise gibt es nicht nur eine Möglichkeit, ein bestimmtes Ziel zu erreichen. –

+3

Beachten Sie, dass seq.Count() (für Objekte, die ICollection nicht implementieren) die vollständige Sequenz aufzählen wird, während seq.Any() zurückgibt, sobald ein Element gefunden wird. Ähnlich, aber anders.:) – dahlbyk

17

Ein weiterer Ansatz, wenn Vote eine Art Referenz und verwendet somit null als der Standardwert, wäre die Null-Koaleszenz-Operator zu verwenden:

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

Aus irgendeinem Grund, wenn ich die resultset in eine Liste drehen, die DefaultIfEmpty() funktioniert ich weiß nicht, ob ich habe inadve rüber ging in Linq Bereich.

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