2009-06-18 31 views
14

Chào buổi sáng!EF khác biệt (IEqualityComparer) Lỗi

Given:

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

này sẽ biên dịch, nhưng trên runtime tôi sẽ nhận được một Linq to Entity could not translate Comparer -Exception.
Bất kỳ đề xuất nào?

Trả lời

29

Nếu bạn đang cung cấp các so sánh của riêng mình, bạn cần phải thực hiện mã gọi trong mã số Distinct. Để đảm bảo điều đó xảy ra, sử dụng AsEnumerable để biến IQueryable<T> vào IEnumerable<T>:

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

Tất nhiên vào thời điểm đó bạn sẽ được kéo dữ liệu hơn trên từ cơ sở dữ liệu. Thay vào đó là nhóm dữ liệu thay thế:

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

Điều đó sẽ giúp bạn trở thành thực thể đầu tiên gặp phải với mỗi ID (giả sử truy vấn-fu của tôi không làm tôi thất bại). Đó là cơ bản những gì Distinct làm anyway, nhưng đó là tất cả tại cơ sở dữ liệu.

(Lưu ý đối với độc giả trong tương lai: gọi First() có ý nghĩa hơn FirstOrDefault(), nhưng dường như điều đó không làm việc.)

+0

Có cơ hội nào để làm điều này không có trong .NET-Layer? Bằng cách nào đó nói cho EF-gọi để làm điều này trong SQL? –

+0

Xem bản chỉnh sửa của tôi - sử dụng nhóm và bạn sẽ nhận được hành vi mong muốn. Nó sẽ là tốt đẹp để có "DistinctBy" trong khuôn khổ (và xử lý bởi EF vv) nhưng tôi nghĩ rằng phiên bản nhóm sẽ làm những gì bạn muốn. –

+0

Cảm ơn bạn! Điều này có vẻ rất hợp lý đối với tôi, vì bạn đang thực hiện nhóm trên một IQueryable . Tôi sẽ thử điều này sau! Tái bút: Có, bạn đã nhận được Điều kiện riêng biệt chính xác :) –

Các vấn đề liên quan