Как я могу отфильтровать 2 таблицы в ASP.NET MVC?

#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;