2012-11-02 22 views
6

Tôi đang làm việc trong ứng dụng asp mvc 3. Tôi có một mô hình/thực thể được gọi là Lịch sử. Tôi có một truy vấn LINQ trả về một giá trị. Tùy thuộc vào những gì tôi làm, tôi hoặc là có được một "Object không được thiết lập để một ví dụ" lỗi trong bộ điều khiển khi phương pháp được gọi là, hoặc tôi nhận được một "không thể ngầm chuyển đổi từ chuỗi để loại Models.History." Vì vậy, tôi đang tìm kiếm sự trợ giúp trong việc giải quyết, tôi chỉ cần bỏ nó hay gì đó?LINQ to Entities - Cách trả về một giá trị chuỗi đơn từ thực thể

Dưới đây là phương pháp cung cấp cho các lỗi 'đối tượng không được thiết lập':

public string GetPastAbuseData(int Id) 
{ 

    var query = (from h in _DB.History 
       where h.ApplicantId.Equals(Id) 
       select h.AbuseComment).FirstOrDefault(); 

    return query.ToString(); 
} 

Bộ điều khiển: vm.HistoryModel.AbuseComment = repo.GetPastAbuseData (Id);

Và nếu tôi thay đổi kiểu phương pháp từ chuỗi Lịch sử tôi nhận được 'không thể chuyển đổi' lỗi:

public History GetPastAbuseData(int Id) 
{ 
    return (from h in _DB.History 
      where h.ApplicantId.Equals(Id) 
      select h.AbuseComment).SingleOrDefault(); 
} 

Cảm ơn bạn đã dành thời gian.

Trả lời

11

Bạn đang chọn AbuseComment thuộc tính (là chuỗi) từ HistoryObject. Do đó, mã của bạn sẽ cố gắng chuyển đổi chuỗi thành History. Chỉ cần trở lại toàn bộ History thực thể:

public History GetPastAbuseData(int Id) 
{ 
    return (from h in _DB.History 
      where h.ApplicantId.Equals(Id) 
      select h).SingleOrDefault(); 
} 

Cũng trong trường hợp đầu tiên query sẽ có kiểu string. Bạn không cần phải gọi số ToString trên biến này. Thậm chí nhiều hơn, khi bạn rơi vào trường hợp OrDefault(), bạn sẽ có NullReferenceException.

public string GetPastAbuseData(int Id) 
{ 
    return (from h in _DB.History 
      where h.ApplicantId.Equals(Id) 
      select h.AbuseComment).FirstOrDefault(); 
} 
+0

lazyberezovsky, cảm ơn bạn. Có vẻ như bây giờ bạn thấy nó rõ ràng. Vì vậy, tôi vừa trả lại toàn bộ mô hình và lấy các mẩu hình tôi cần theo quan điểm của mình. cảm ơn bạn. – BattlFrog

4

Ví dụ đầu tiên của bạn là tốt, bạn chỉ cần kiểm tra giá trị rỗng.

public string GetPastAbuseData(int Id) 
{ 

    var query = (from h in _DB.History 
      where h.ApplicantId.Equals(Id) 
      select h.AbuseComment).FirstOrDefault(); 

    return query == null ? string.empty : query; 
} 
+0

OK đối với chuỗi có giá trị 'null'. Tại sao bạn thay thế nó bằng 'String.Empty'? –

+0

Rất nhiều người không thích các giá trị null, ngay cả đối với chuỗi. Tôi thường kết hợp lại trong trường hợp đó: truy vấn trả về ?? ""; – Dismissile

2

Bạn có thể sử dụng toán tử kết hợp rỗng sẽ kiểm tra nếu null và trả về chuỗi.Empty nếu nó rỗng. ?? Operator

public string GetPastAbuseData(int Id) 
{ 
    return _DB.History.FirstOrDefault(h=>h.ApplicantId.Equals(Id)).Select(h=>h.AbuseComment) ?? string.Empty; 
} 
Các vấn đề liên quan