2012-11-02 4 views
6

Sto lavorando in asp mvc 3 app. Ho un modello/entità chiamata Storia. Ho una query linq che restituisce un valore. A seconda di ciò che faccio, ottengo un errore "Oggetto non impostato su un'istanza" nel controller quando viene chiamato il metodo, oppure ottengo un "impossibile convertire implicitamente da stringa a tipo Models.History." Quindi sto cercando assistenza per la risoluzione, devo solo lanciarlo o qualcosa del genere?LINQ alle entità - Come restituire un valore di stringa singola dall'entità

Ecco il metodo che dà la 'oggetto non impostato' errore:

public string GetPastAbuseData(int Id) 
{ 

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

    return query.ToString(); 
} 

Controller: vm.HistoryModel.AbuseComment = repo.GetPastAbuseData (Id);

E se cambio il tipo di metodo dalla stringa Storia ottengo l'errore 'non in grado di convertire':

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

Grazie per il vostro tempo.

risposta

11

Si sta selezionando AbuseComment proprietà (che è una stringa) da HistoryObject. Quindi il tuo codice prova a convertire la stringa in History. Basta tornare intero History entità:

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

Anche nel primo caso query sarà di tipo stringa. Non è necessario chiamare ToString su questa variabile. Inoltre, quando cadi nel caso OrDefault(), avrai NullReferenceException.

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

lazyberezovsky, grazie. Sembra così ovvio ora che lo fai notare. Quindi ho appena restituito l'intero modello e ho preso le parti di cui avevo bisogno a mio avviso. grazie. – BattlFrog

4

Il tuo primo esempio va bene, è sufficiente controllare null.

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

va bene che la stringa abbia valore 'null'. Perché lo stai sostituendo con 'String.Empty'? –

+0

A molte persone non piacciono i valori nulli, anche per le stringhe. Di solito mi unisco in quel caso: domanda di ritorno ?? ""; – Dismissile

2

È possibile utilizzare l'operatore null coalescenza che controllerà se nulla e tornare string.Empty se è nullo. ?? Operator

public string GetPastAbuseData(int Id) 
{ 
    return _DB.History.FirstOrDefault(h=>h.ApplicantId.Equals(Id)).Select(h=>h.AbuseComment) ?? string.Empty; 
} 
Problemi correlati