2016-03-19 13 views
-2

Geçtiğimiz günlerde bu sorunu çözdüm, bu da biraz zaman aldı. Ben kod böyle parça var: DefaultIfEmpty davranış belirtimleri

private Member FindMemberByName(string name) 
{ 
    var member = 
     this.db.Members.AsEnumerable() 
     .Where(d => d.ShortName == name) 
     .DefaultIfEmpty(this.CreateNewMember(name)) 
     .First(); 
    return member; 
} 

private Member CreateNewMember(string name) 
{ 
    return this.db.Members.Add(new Member { Name = name }); 
} 

Ben FindMemberByName beklenen() Mevcut varlığı dönmek ve bulunmadığı zamanlarda yeni varlık yaratmak ve bir dönüş.

Ancak, varolan ad geçse bile CreateNewMember() çağrıldığını fark ettim.

+2

Kullanılacak varsayılan nesneye başvuruda bulunmayan benzer bir yöntemi kodlayarak bunu görebilirsiniz: FirstOrDefault() ?? EndNewMember', endişelerin mikro ayrımıdır. –

cevap

1

Biraz hata ayıkladıktan sonraparametresinin değeri, First() yöntemi çağrılmasa bile hemen değerlendirilir. Yani aslında sonuçta IEnumerable'ın boş olup olmadığını anlamak için değerlendirilir.

Sorunu çözmeye çalışmak için birkaç saat harcadım. Umarım bu, başkalarının aynı miktarda tasarruf etmesine yardımcı olur :-)

+8

Lütfen cevabınızı sorunuzun dışına taşıyın ve cevaba verin. (Kendi kendine cevap veren sorular iyidir, ancak uygun soru/cevap formatında yapılmalıdır.) –

3

Sormak istediğiniz davranışın LINQ ile hiçbir ilgisi yoktur. DefaultIfEmpty() parametre listesine yerleştirdiğiniz yöntem DefaultIfEmpty() hiç çağrılmadan önce değerlendirilecektir.

void Main() 
{ 
    CalledMethod(CreateDefault("Hello World")); 
} 

void CalledMethod<TSource>(TSource defaultValue) 
{ 
} 

TestClass CreateDefault(string message) 
{ 
    return new TestClass() { Message = message, }; 
} 

public class TestClass 
{ 
    public string Message { get; set; } = null; 
    public TestClass() { } 
}