Проекция Linq: DbExpressionBinding требует входное выражение с коллекцией ResultType - PullRequest
0 голосов
/ 09 ноября 2018

В следующем запросе linq все работало нормально, пока я не решил изменить свое свойство 'SerialNoInvoiceOrdrelineDeliveryCloses' в My ViewModel на List с использованием проекции Linq, но при попытке выполнить запрос:

    public ActionResult test(string sortOrder, string searchString, string currentFilter, int? page) {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "fak_desc" : "";
        ViewBag.NameSortParmtwo = String.IsNullOrEmpty(sortOrder) ? "order_desc" : "";

        string EmailID = Session["Email"].ToString();
        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        var v = (from cbr in db.Contact_Business_Relation
                 join c in db.Contact on cbr.Contact_No_ equals c.Company_No_
                 join sa in db.Sales_Invoice_Header on cbr.No_ equals sa.Sell_to_Customer_No_
                 join sih in db.Sales_Invoice_Line on sa.No_ equals sih.Document_No_
                 join item in db.Item_Ledger_Entry on sih.No_ equals item.Item_No_

                 where c.E_Mail == EmailID
                 &&
                 sih.Type == 2
                 &&
                 item.Source_Type == 1
                 &&
                 item.Document_Type == 1
                 &&
                 item.Entry_Type == 1
                 select new ClosedOrders
                 {
                     SalesInvoiceQuantity = db.Sales_Invoice_Line.Where(l => l.Document_No_ == sa.No_).Select(l => l.Quantity).DefaultIfEmpty(0).Sum(),
                     CreatedDate = sa.Posting_Date,
                     DeliveryAddress = sa.Ship_to_Address + ", " + sa.Ship_to_Post_Code + " " + sa.Ship_to_City + ", " + sa.Ship_to_Country_Region_Code,
                     Reference = sa.External_Document_No_,
                     OrderNumber = sa.Order_No_,
                     Fakturanummer = sa.No_,
                     Total = 0,
                     AntalAfsendteVarer = 0,
                     AntalVarer = 0,
                     varnummer = sih.No_,
                     SerialNoInvoiceOrdrelineDeliveryCloses = (from Serial_No moc in item.Serial_No_

                                                               select new Serial_No
                                                               {
                                                                   Snumber = moc.Snumber
                                                               }).ToList()
                 }).Distinct();


        if (!String.IsNullOrEmpty(searchString))
        {
            v = v.Where(s => s.Fakturanummer.Contains(searchString)
                                   || s.OrderNumber.Contains(searchString));
        }
        switch (sortOrder)
        {
            case "fak_desc":
                v = v.OrderByDescending(s => s.Fakturanummer);
                break;
            case "order_desc":
                v = v.OrderByDescending(s => s.OrderNumber);
                break;
            default:
                v = v.OrderBy(s => s.CreatedDate);
                break;
        }

        int pageSize = 3;
        int pageNumber = (page ?? 1);
        return View(v.ToPagedList(pageNumber, pageSize));
    }

Но когда он пытается выполнить запрос, он выдает ошибку:

DbExpressionBinding требует входное выражение с коллекцией ResultType. Параметернавн: ввод

Вот моя ViewModel:

public class ClosedOrders
{

    public DateTime CreatedDate { get; set; }
    public string OrderNumber { get; set; }
    public string DeliveryAddress { get; set; }
    public string Reference { get; set; }
    public decimal AntalVarer { get; set; }
    public decimal AntalAfsendteVarer { get; set; }
    public decimal Total { get; set; }
    public string Fakturanummer { get; set; }
    public decimal SalesInvoiceQuantity { get; set; }
    public string Email { get; set; }
    public List<Serial_No> SerialNoInvoiceOrdrelineDeliveryCloses { get; set; }
    public string varnummer { get; set; }

}

public class Serial_No
{
    public string Snumber { get; set; }
}

Вот мой взгляд:

@model PagedList.IPagedList<Modelnamespace.Models.ClosedOrders>
@using PagedList.Mvc;

@using (Html.BeginForm("test", "Account", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
        <input type="submit" value="Search" />
    </p>
}
<table class="table">
    <tr>
        <th>
            @Html.ActionLink("Fakturanummer", "test", new { sortOrder = ViewBag.NameSortParm, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>
            CreatedDate
        </th>
        <th>
            @Html.ActionLink("OrderNumber", "test", new { sortOrder = ViewBag.NameSortParmtwo, currentFilter = ViewBag.CurrentFilter })
        </th>
        <th>serial</th>
        <th>vare</th>
    </tr>


    @foreach (var item in Model)
    {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Fakturanummer)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.OrderNumber)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CreatedDate)
        </td>
        <td>  @Html.DisplayFor(modelItem => item.SerialNoInvoiceOrdrelineDeliveryCloses)</td>
        <td>  @Html.DisplayFor(modelItem => item.varnummer)</td>
    </tr>
    }

</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount

@Html.PagedListPager(Model, page => Url.Action("test",
    new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

Может ли кто-нибудь помочь мне или указать мне правильное направление! заранее спасибо

1 Ответ

0 голосов
/ 09 ноября 2018

Я считаю, что эта часть вызывает все проблемы:

SerialNoInvoiceOrdrelineDeliveryCloses =
  (from Serial_No moc in item.Serial_No_
   select new Serial_No
   {
       Snumber = moc.Snumber
   }).ToList()

Дело в том, что это часть запроса, которая должна быть преобразована в оператор SQL для выполнения в базе данных. И new Serial_No или ToList просто не могут быть переведены в SQL. Отсюда и эта загадочная ошибка. Эта ситуация очень похожа на ситуацию, наблюдаемую в этой теме .

Чтобы решить эту проблему, вам может понадобиться загрузить данные в некоторый промежуточный объект, а затем преобразовать в ClosedOrders экземпляр.

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