2009-07-14 13 views

cevap

1

: Vote bir referans türüdür ve bu nedenle varsayılan değer olarak null kullanıyorsa

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

FYI, bu orijinal sorunuzu tatmin etmedi. Önceden var olmadıysa yeni bir değer oluşturmamak için varsayılan bir değer döndürmesini açıkça talep ettiniz. (Bu iyi bir kod, istediğini yapmıyorsun.) – BenSwayne

5

Kendi uzatma yönteminizi ekleyin. Örneğin: kapsamına bu sınıfın ile

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

, şunları söyleyebilirsiniz: o olsaydı

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

, senin yöntem ayrıca, varsayılan (T) döndüren bir aşırı yüklenme ne nerede aramak. Yerleşik Uzantı sınıfında zaten bir DefaultIfEmpty uzantısı yöntemi tanımlanmıştır, bu yüzden daha iyi bir uyum gibi görünen "FirstOrDefault" örneğinde yöntemi adlandırdım.

+0

DefaultIfEmpty() zaten bir uzantısı yöntemiyle :) olarak var Haklısınız, ben kullanmak için örnek düzenlenmiş ediyoruz http://msdn.microsoft.com/en-us/library/bb355419.aspx –

+0

daha iyi isim. – driis

+0

Neden zaten bu amaç için tasarlanmış bir tane varsa, bir FirstOrDefault yeniden yazmalıyım? – Pablo

3

İlk öğeyi almadan önce varsayılan değeri ekleyin. Şimdi güvenle First() yerine FirstOrDefault() kullanabilirsiniz

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

Not. İdareye

GÜNCELLEME

LINQ DefaultIfEmpty() uzatma yöntemini tanımıyor. Ancak sadece boş birleştirme işlecini kullanabilirsiniz. Ben çok basit bir yaklaşım için gidiş sona erdi

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

Bir varsayılan eklerken İlkini kullanabilirsiniz, FirstOrDefault neden var? – Pablo

+0

LINQ operatörlerinin birçoğu biraz gereksizdir - sequence.Any(), sequence.Count()> 0 olarak yeniden yazılabilir. Sequence.Where (item => Condition (item)) kullanabilirsiniz. First() veya sequence.First (madde => Durum (öğe)). Bağlantıları veya iç içe geçmiş sorguları kullanabilirsiniz. Kod yazarken, yapmak ve döngüler için kullanabilirsiniz. Sen de goto kullanabilirsin. Genellikle belirli bir hedefe ulaşmak için sadece bir yol yoktur. –

+3

Not Seq.Count() (ICollection uygulamayan nesneler için), bir öğe bulunur bulunmaz seq.Any() öğesi dönerken tam diziyi sıralar. Benzer, ama farklı.:) – dahlbyk

17

başka bir yaklaşım, null coalescing operatörünü kullanmak olacaktır nedense

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

bir Listesine resultset açarsanız, DefaultIfEmpty() Ben inadve ettik eğer bilmiyorum çalışır: ikinci sildim olduğunu burada bir cevap tarafından tavsiye edildiği Linq alanına çapraz olarak geçti.

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