Я был уверен, что проблема возникла в этой строке:
return View(_context.ContractMonth.Where(x => x.contracts.Contract_Num).ToString())
Вот несколько проблем, которые я обнаружил:
1) Для метода расширения LINQ Where()
требуется логическое выражение с оператором равенствадля параметра метода действия, а не просто использовать Contract_Num
напрямую.
2) ToString()
в конце Where()
в LINQ to Entities вернет полное имя экземпляра IQueryable
вместо выбранного Contract_Num
s.Вместо этого используйте ToList()
для возврата List
collection.
Поэтому, основываясь на вашем контроллере и представлении и предполагая, что Contract_Num
является int
, вы должны вернуть список из метода действия, как в следующем примере:
public ActionResult Index(int? Contract_Num)
{
if (Contract_Num != null)
{
var list = _context.ContractMonth.Where(x => x.contracts.Contract_Num == Contract_Num.Value).ToList();
return View(list);
}
else
{
// return new empty list
}
}
Если у вас есть отношение внешнего ключа между Contracts
и ContractMonth
, я предлагаю вам использовать join
синтаксис или Join
метод расширения:
public ActionResult Index(int? Contract_Num)
{
if (Contract_Num != null)
{
var list = (from cm in _context.ContractMonth
join ct in _context.Contracts
on cm.Contract_Num equals ct.Contract_Num
where cm.Contract_Num == Contract_Num.Value
select cm).ToList();
return View(list);
}
else
{
// return new empty list
}
}
Дополнительно, чтобы предотвратить попадание как нулевого значения, так и пустого списка в цикл foreach
, перед повторением списка необходимо поставить условие if:
@if (Model != null && Model.Count > 0)
{
@foreach (var item in Model)
{
// DisplayFor and other stuff
}
}
Примечание: Необходимо избегать ненужных приведений типоввнутри запроса LINQ to Entities, насколько это возможно, потому что некоторые методы приведения типа, например, ToString()
, не могут быть преобразованы в оператор SQL.