2013-04-30 38 views
6

Tôi có đoạn mã sau:Gọi là không có tham số rỗng

public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) 
{ 
    AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); 
    ContactEventValue value = ent.ContactEventValues.SingleOrDefault(
     x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
     && x.ProgramCode == programCode && x.BrandCode == brandCode); 
} 

Khi tôi gọi nó với giá trị cho brandCode và programCode, tôi nhận được giá trị kỳ vọng trở về từ cơ sở dữ liệu. Khi tôi thực hiện cuộc gọi nhưng thiết lập một cách rõ ràng x.ProgramCode và x.BrandCode null tôi nhận giá trị mặc định sẽ trở về từ cơ sở dữ liệu:

ContactEventValue value = ent.ContactEventValues.Single(
     x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
     && x.ProgramCode == null && x.BrandCode == null); 

Tuy nhiên, khi tôi gọi phương thức với null cho programCode và brandCode, tôi lấy lại null từ cơ sở dữ liệu!

tôi đã cố gắng thay đổi == để Equals() cho mỗi câu trả lời cho vấn đề này: Nullable optional parameter

Vì vậy x.BrandCode.Equals (brandCode) x.BrandCode thay thế == brandCode, và x.ProgramCode.Equals (programCode) thay thế x.ProgramCode == programCode, nhưng điều đó vẫn không hoạt động.

Tôi cũng đã thử sử dụng ?? nhà điều hành, vẫn không hoạt động.

Sự cố này cho biết giải pháp không được tìm thấy và anh/chị phải sử dụng quy trình được lưu trữ: EF 4 Query - Issue with Multiple Parameters Tôi thực sự không muốn phải đến đó.

Bất kỳ ý tưởng nào?

Trả lời

9

Tôi không biết bạn đang sử dụng phiên bản EF nào, nhưng so sánh null là một vấn đề trước phiên bản 5. Nếu bạn kiểm tra SQL thực sự được phát ra, có thể bạn sẽ thấy rằng IS NULL không được sử dụng trong truy vấn.

Trong EF 6, bạn sẽ có thể thiết lập các tùy chọn cấu hình UseDatabaseNullSemantics tiếp xúc trên DbContext:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
     this.Configuration.UseDatabaseNullSemantics = true; 
    } 
} 

Đối với EF 5, bạn có thể sử dụng cài đặt UseCSharpNullComparisonBehavior trên cơ bản ObjectContext:

public class MyContext : DbContext 
{ 
    public MyContext() 
    { 
     var objectContextAdapter = this as IObjectContextAdapter; 
     objectContextAdapter. 
      ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior = true;  
    } 
} 

Tuy nhiên, bạn sẽ cần sử dụng .NET Framework 4.5 cho dự án của mình. Nếu bạn không muốn sử dụng 4,5, thì bạn có thể sử dụng một trong các cách giải quyết được liệt kê tại How can i query for null values in entity framework?.

+0

Chúng tôi đang sử dụng EF 5.0.0. Tôi đã cố gắng thiết lập UseDatabaseNullSemantics trên Configuration, nhưng UseDatabaseNullSemantics không tồn tại. Googled nó và UseDatabaseNullSemantics dường như không tồn tại trong C#. – jgerman

+0

Tôi đã cập nhật câu trả lời của mình. – devdigital

+0

Chúng tôi đang sử dụng .Net 4.5. Điều đó đã hiệu quả! Cảm ơn nhiều! – jgerman

1

Tắt ?? giải pháp điều hành không hoạt động, tôi chỉ đơn giản là không áp dụng nó cho cả hai mặt của các câu lệnh ==. Vì vậy, mã sau đây giải quyết được vấn đề:

public static ContactEventValue GetContactEventValue(ContactEventType contactEventType, string programCode, string brandCode) { 
    AdvocacyEntities ent = AdvocacyEntities.GetReadOnlyInstance(); 
    ContactEventValue value = ent.ContactEventValues.SingleOrDefault(
      x => x.ContactEventTypeID == contactEventType.ContactEventTypeID 
      && (x.ProgramCode ?? "") == (programCode ?? "") 
      && (x.BrandCode ?? "") == (brandCode ?? "")); 

Tuy nhiên, điều này gây ra chuỗi trống và không tương đương. Không lý tưởng.

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