Как я могу фильтровать в 2 таблицы в ASP.NET MVC? - PullRequest
0 голосов
/ 30 марта 2019

Я хочу искать в таблицах по 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'

Как я могу это сделать?

Ответы [ 4 ]

0 голосов
/ 01 апреля 2019

Я был уверен, что проблема возникла в этой строке:

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.

0 голосов
/ 30 марта 2019

Вы забыли включить фильтр и преобразование int в строку. Используйте код ниже, это полезно для вас

var contractMonth = _context.ContractMonth.FirstOrDefault (x => x.contracts.Contract_Num.ToString () == Contract_Num);

var contactNumber = cm.Contract_Num;

возвратный просмотр (contactNumber.ToString ());

0 голосов
/ 30 марта 2019

вам нужно привести обе переменные в один тип данных, чтобы вы могли сравнить.

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);
0 голосов
/ 30 марта 2019

Вы забыли включить значение фильтра и использовать Single вместо Where:

var cm = _context.ContractMonth.Single(x => x.contracts.Contract_Num == Contract_Num);
var cn = cm.Contract_Num;

return View(cm.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...