首页 > 解决方案 > 如何在列表中搜索

问题描述

我有一个List<string>在我的视图中有一些看起来像这样的项目:

1S61A9MAT1DKV5N74925,
1S61A9MAT1DKV5X49329,
1S61A9MAT1DKV5X49857

我想在这个项目之后搜索,但老实说我不知道​​我应该告诉我的控制器什么,当它来的时候List<string>我在我的控制器中尝试了类似的东西s.SerialNoInvoiceOrdrelineDeliveryCloses.Contains(searchString)但它不起作用,我的意思是当我搜索这个项目1S61A9MAT1DKV5N74925时它可以将值传递给控制器​​,但它找不到我搜索的那个项目的任何结果。正如你在我的
Contorller 中看到的,我有一些属性是字符串,还有一个是List<string>SerialNoInvoiceOrdrelineDeliveryCloses

控制器:

 public ActionResult test(string searchString) {

        string EmailID = Session["Email"].ToString();

        var v = (from cbr in db.Contact_Business_Relation
                 join c in db.Contact on cbr.Contact_No_ equals c.Company_No_
                 join sih in db.Sales_Invoice_Line on sa.No_ equals sih.Document_No_
                 where c.E_Mail == EmailID

                 select new ClosedOrders
                 {
                     OrderNumber = sa.Order_No_,
                     Fakturanummer = sih.Document_No_,
                     varnummer = sih.No_,

                     //List<string>
                     SerialNoInvoiceOrdrelineDeliveryCloses = db.Item_Ledger_Entry
                     .Where(s => s.Item_No_ == sih.No_)
                     .Select(s => s.Serial_No_)
                     .ToList()
                 });

        if (searchString !=null)
        {
            v = v.Where(s => s.OrderNumber.Contains(searchString) 
                        || s.Fakturanummer.Contains(searchString)
                        || s.varnummer.Contains(searchString) 
                        || s.SerialNoInvoiceOrdrelineDeliveryCloses.Contains(searchString) 
                      );
        }
        return View(v);
    }

视图模型:

public class ClosedOrders
{
    public string OrderNumber { get; set; }
    public string Fakturanummer { get; set; }
    public List<string> SerialNoInvoiceOrdrelineDeliveryCloses { get; set; }
    public string varnummer { get; set; }
}

看法:

@using (Html.BeginForm("test", "Account", FormMethod.Get))
{
    <p>
        Find by name: @Html.TextBox("SearchString")
        <input type="submit" value="Search" />
    </p>
}

//Loop Model
        foreach (var item in Model)
        { 
            <tr>
                <td>
                    @item.Fakturanummer
                </td>
                <td>
                    @item.OrderNumber
                </td>
                <td> @item.varnummer</td>
                <td>
                    @String.Join(", ", item.SerialNoInvoiceOrdrelineDeliveryCloses)
                </td>
            </tr>
        }

标签: c#linq

解决方案


v问题是您正在发送IQueryable<ClosedOrders>视图。IQueryable将 an 传递给视图并让它运行查询是一种不好的做法。首先是因为您将未解决的查询发送到端点,其次您需要将相关引用添加到您的视图代码。我建议您.ToList()在查询末尾添加并将列表发送到视图:

var v = (from cbr in db.Contact_Business_Relation
                 join c in db.Contact on cbr.Contact_No_ equals c.Company_No_
                 join sih in db.Sales_Invoice_Line on sa.No_ equals sih.Document_No_
                 where c.E_Mail == EmailID

                 select new ClosedOrders
                 {
                     OrderNumber = sa.Order_No_,
                     Fakturanummer = sih.Document_No_,
                     varnummer = sih.No_,

                     //List<string>
                     SerialNoInvoiceOrdrelineDeliveryCloses = db.Item_Ledger_Entry
                     .Where(s => s.Item_No_ == sih.No_)
                     .Select(s => s.Serial_No_)
                     .ToList()
                 }).ToList();

和:

v = v.Where(s => s.OrderNumber.Contains(searchString) 
                        || s.Fakturanummer.Contains(searchString)
                        || s.varnummer.Contains(searchString) 
                        || s.SerialNoInvoiceOrdrelineDeliveryCloses.Contains(searchString) 
                      ).ToList();

推荐阅读