2014-04-21 11 views
5

Sono nuovo nell'utilizzo di Linq e sto cercando di creare una ricerca che cercherà per numero di grafico e visualizzerà i risultati in una nuova vista di azione. Quando eseguo il codice ottengo l'errore "DbComparisonExpression richiede argomenti con tipi comparabili". Credo che questo abbia qualcosa a che fare con il tipo di ricerca essendo il numero della stringa e del grafico int, ma non sono sicuro di come risolvere il problema. Qualsiasi aiuto sarebbe molto apprezzato!DbComparisonExpression richiede argomenti con tipi comparabili

Controller:

public ActionResult Index(string searchTerm = null) 
{ 
    var model = 
     db.Patient 
     .Where(r => searchTerm == null || r.ChartNumber.Equals(searchTerm)) 
       .Select(r => new NewListModel 
       { 
        ChartNumber = r.ChartNumber, 
        FirstName = r.FirstName, 
        LastName = r.LastName, 
       } 
       ); 
    return View(model); 
} 

Modello:

public class NewListModel 
{ 
    public int ChartNumber { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 

} 

Vista:

@model IEnumerable<Project.Models.NewListModel> 
@{ 
    ViewBag.Title = "Home Page"; 
} 

<form method="get"> 
    <input type="search" name="searchTerm" /> 
    <input type="submit" value="Search by Chart Number" /> 
</form> 

@foreach (var item in Model) 
{ 
    <div> 
     <h4>@item.ChartNumber</h4> 

    </div> 
    <div>@item.FirstName</div> 
    <div>@item.LastName</div> 

} 

Nuovo regolatore

public ActionResult Index(string searchTerm = null) 
     { 
      int chartNo; 
      if (searchTerm == null || Int32.TryParse(searchTerm, out chartNo)) { 
      var model = db.Patient 
      .Where(r => searchTerm == null || r.ChartNumber == chartNo) 
      .Select(r => new NewListModel 
       { 
        ChartNumber = r.ChartNumber, 
        FirstName = r.FirstName, 
        LastName = r.LastName, 
       } 
       ); 
      return View(model); 
      } else { 
       //Invalid number entered 
      } 
      } 
+0

è 'ChartNumber' una stringa o Int? o esegui un corretto 'Casting' o usa il confronto corretto per esempio quando confronti oggetti simili usano object.Equals, altrimenti prova a cambiare r.ChartNumber = Convert.ToInt32 (searchTerm) – MethodMan

+0

o cambia la tua query per usare' == 'quando fai il confronto sul lato sinistro, EF non sembra prendere in considerazione gli operatori di conversione del tipo. – MethodMan

risposta

2

Convertire l'entrata del numero da un int:

int chartNo = 0; 
if (searchTerm == null || Int32.TryParse(searchTerm, out chartNo)) { 
    var model = db.Patient 
     .Where(r => searchTerm == null || r.ChartNumber == chartNo) 
     .Select(...); 
    return ...; 
} else { 
    // Invalid number entered 
} 
+0

Aggiunto in questa logica e sto ora ottenendo l'uso della variabile locale non assegnata 'chartNo' – dc922

+0

Questo può essere semplicemente corretto inizializzandolo con '0'. Si prega di consultare il mio esempio modificato. –

Problemi correlati