#c# #asp.net-mvc
#c# #asp.net-mvc
Вопрос:
Я хочу выполнить поиск в таблицах по Contract_Num
, который находится в другой таблице, но между ними есть взаимосвязь.
<b>Search By:</b>
@Html.TextBox("contracts.Contract_Num") <text>Contract Number</text>
<input type="submit" value="Search" />
@foreach (var item in Model)
{
<tbody>
<tr>
<td>
@Html.DisplayFor(modelItem => item.contracts.Contract_Num)
</td>
<td>
@Html.DisplayFor(modelItem => item.Monthe)
</td>
<td>
@Html.DisplayFor(modelItem => item.contracts.AmountOfRent)
</td>
<td>
@Html.DisplayFor(modelItem => item.Receipt)
</td>
<td>
@{
var Balance = item.contracts.AmountOfRent - item.Receipt;
}
@Balance
</td>
<td>
@Html.DisplayFor(modelItem => item.Not)
</td>
<td>
@Html.ActionLink("تعديل", "Edit", new { id = item.ContractMonth_Id }) |
@Html.ActionLink("التفاصيل", "Details", new { id = item.ContractMonth_Id }) |
@Html.ActionLink("حذف", "Delete", new { id = item.ContractMonth_Id })
</td>
</tbody>
}
</table>
</div>
</div>
</div>
}
Это контроллер :
//GET: ContractMonth
public ActionResult Index(string Contract_Num)
{
return View(_context.ContractMonth
.Where(x => x.contracts.Contract_Num).ToString());
}
Но я получаю сообщение об ошибке:
Не удается неявно преобразовать ‘int’ в ‘bool’
Как я могу это сделать?
Ответ №1:
Вы забыли включить значение фильтра и использовать Single вместо Where:
var cm = _context.ContractMonth.Single(x => x.contracts.Contract_Num == Contract_Num);
var cn = cm.Contract_Num;
return View(cm.ToString());
Комментарии:
1. оператор ‘==’ не может быть применен к операнду типа ‘int’, и появляется строка с этой ошибкой
2. вы можете изменить
Index(string Contract_Num)
наIndex(int Contract_Num)
3. Словарь параметров содержит нулевую запись для параметра ‘Contract_Num’ ненулевого типа ‘System.Int32’ для метода ‘System.Web.Mvc.ActionResult Index(Int32)’ в ‘RES.Controllers. ContractMonthController’. Необязательный параметр должен иметь ссылочный тип, тип с возможностью обнуления или быть объявлен как необязательный параметр. Имя параметра: parameters (параметры)
4. Использовать
Index(int? Contract_Num)
Ответ №2:
вам нужно привести обе переменные к одному типу данных, чтобы вы могли сравнивать.
List<ContractMonth> contractMonth = new List<ContractMonth>();
contractMonth =_context.ContractMonth.Where(x =>( x.contracts.Contract_Num==null?"":contracts.Contract_Num.ToString()) == Contract_Num.ToString()).ToList();
return View(contractMonth);
Комментарии:
1. эта ошибка возникает при запуске приложения: последовательность не содержит элементов
2. я могу сделать это в j Query? может быть, это битер
3. не могли бы вы, пожалуйста, поделиться, что такое ContractMonth? что вы храните в ContractMonth, схема ContractMonth и т. Д
4. вы можете выполнить поиск в Jquery, будет лучше, если вы загрузите все данные одним выстрелом
5. Как я могу это сделать, может мне помочь?
Ответ №3:
Я был уверен, что проблема возникла в этой строке:
return View(_context.ContractMonth.Where(x => x.contracts.Contract_Num).ToString())
Вот несколько проблем, которые я обнаружил:
1) Метод расширения LINQ Where()
требует логического выражения с оператором равенства параметру метода action, а не просто использовать Contract_Num
напрямую.
2) ToString()
в конце Where()
в LINQ to Entities будет возвращено полное имя IQueryable
экземпляра вместо выбранных Contract_Num
s. Вместо этого используйте ToList()
для возврата List
коллекции.
Поэтому, основываясь на вашем контроллере и представлении и предполагая, что Contract_Num
это int
, вы должны вернуть список из метода action, подобного этому примеру ниже:
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 amp;amp; Model.Count > 0)
{
@foreach (var item in Model)
{
// DisplayFor and other stuff
}
}
Примечание: Вам нужно избегать ненужных приведений типов внутри запроса LINQ to Entities, насколько это возможно, потому что некоторые методы приведения, такие как ToString()
, не преобразуются в инструкцию SQL.
Ответ №4:
Вы забыли включить преобразование filter и int в string. Используйте приведенный ниже код, это полезно для вас
var contractMonth= _context.ContractMonth.FirstOrDefault(x => x.contracts.Contract_Num.toString() == Contract_Num);
var contactNumber= cm.Contract_Num;
верните представление (contactNumber.toString());
Комментарии:
1. Ссылка на объект не установлена для экземпляра объекта. Строка 43: переменная contactNumber = contractMonth.contracts. Contract_Num;