2009-06-18 10 views
14

गुड मॉर्निंग!एफई अलग (IEqualityComparer) त्रुटि

को देखते हुए:

public class FooClass 
{ 
    public void FooMethod() 
    { 
     using (var myEntity = new MyEntity) 
     { 
      var result = myEntity.MyDomainEntity.Where(myDomainEntity => myDomainEntity.MySpecialID > default(int)).Distinct(new FooComparer); 
     } 
    } 

} 

public class FooComparer : IEqualityComparer<MyEntity.MyDomainEntity> 
{ 
    public bool Equals(MyEntity.MyDomainEntity x, MyEntity.MyDomainEntity y) 
    { 
     return x.MySpecialID == y.MySpecialID; 
    } 

    public int GetHashCode(MyEntity.MyDomainEntity obj) 
    { 
     return obj.MySpecialID.GetHashCode(); 
    } 
} 

यह संकलन होगा, लेकिन क्रम पर मैं एक Linq to Entity could not translate Comparer -Exception मिल जाएगा।
कोई सुझाव?

उत्तर

29

आप अपने खुद के तुलना प्रदान कर रहे हैं, तो आप नेट कोड में Distinct कॉल पर अमल करने की आवश्यकता होगी। उस समय आप डेटाबेस से भर में और अधिक डेटा खींच हो जाएगा पर

var result = myEntity.MyDomainEntity 
     .Where(myDomainEntity => myDomainEntity.MySpecialID > default(int)) 
     .AsEnumerable() 
     .Distinct(new FooComparer()); 
बेशक

: सुनिश्चित करें कि ऐसा होता है बनाने के लिए, AsEnumerableIEnumerable<T> में IQueryable<T> चालू करने के लिए इस्तेमाल करते हैं। एक वैकल्पिक समूह के बजाय डेटा है:

var result = from entity in myEntity.MyDomainEntity 
      where entity.MySpecialID > 0 
      group entity by entity.MySpecialID into groups 
      select groups.FirstOrDefault(); 

है कि आप प्रत्येक आईडी के साथ सामना करना पड़ा पहले इकाई मिल जाएगा (यह मानते हुए मेरी क्वेरी फू मुझे असफल नहीं है)। यह मूल रूप से क्या विचलित करता है, लेकिन यह सब डेटाबेस में है।

(भविष्य पाठकों के लिए नोट: First() बुला FirstOrDefault() की तुलना में अधिक समझ में आता है, लेकिन जाहिरा तौर पर वह काम नहीं करता।)

+0

इस नेट परत में नहीं करने के लिए कोई मौका है? एसक्यूएल में ऐसा करने के लिए किसी भी तरह ईएफ-कॉल बताएं? –

+0

मेरा संपादन देखें - समूह का उपयोग करें और आपको वांछित व्यवहार मिलेगा। ढांचे में "DistinctBy" होना अच्छा लगेगा (और ईएफ आदि द्वारा संभाला जाता है) लेकिन मुझे लगता है कि समूहीकृत संस्करण वही करेगा जो आप चाहते हैं। –

+0

धन्यवाद! यह मेरे लिए बहुत व्यावहारिक लग रहा है, क्योंकि आप एक IQueryable पर समूह कर रहे हैं। मैं इसे बाद में कोशिश करूंगा! पीएस .: हां, आपको विशिष्ट-हालत सही मिल गई है :) –

संबंधित मुद्दे