【问题标题】:LINQ query to MVC Viewmodel multiple tables and listsLINQ 查询到 MVC Viewmodel 多个表和列表
【发布时间】:2016-02-21 17:58:50
【问题描述】:

我正在尝试进行一项查询以访问数据库以获取 5 个不同的表,以便在一个视图模型中发送到我的视图。这是我的数据类。

public partial class Table_Parts_Warehouse
{
    public int CQPN { get; set; }
    public int CATEGORY { get; set; }
    public int SUBCATEGORY { get; set; }
    public string DESCRIPTION { get; set; }
    public int QTY { get; set; }
    public Nullable<int> MINSTK { get; set; }
    public Nullable<int> MAXSTK { get; set; }
    public Nullable<decimal> COST { get; set; }
}

public partial class Table_Parts_Order
{
    public int ORDERID { get; set; }
    public System.DateTime DATE { get; set; }
    public bool STATUS { get; set; }
    public string PONO { get; set; }
    public string INVOICENO { get; set; }
    public string QUOTENO { get; set; }
    public int COMPANYID { get; set; }
    public Nullable<decimal> COST { get; set; }
}

public partial class Table_Parts_OrderPart
{
    public int ORDERPARTID { get; set; }
    public int ORDERID { get; set; }
    public int CQPN { get; set; }
    public int ORDERQTY { get; set; }
    public Nullable<int> RECVQTY { get; set; }
    public string PARTNO { get; set; }
}

public partial class Table_Parts_Vendor
{
    public int COMPANYID { get; set; }
    public string PHONENO { get; set; }
    public string COMPANYNAME { get; set; }
}

public partial class Table_Parts_Part
{
    public int PARTID { get; set; }
    public int CQPN { get; set; }
    public string PARTNO { get; set; }
    public decimal COST { get; set; }
    public int COMPANYID { get; set; }
    public int QTY { get; set; }
}

我的视图模型类在这里,所有这些类,订单类是单个订单条目,但其余都是该订单的关联零件和数据的列表。

public class OrderDetailsViewModel
{
    public Table_Parts_Order tb_parts_order { get; set; }
    public List<Table_Parts_OrderPart> tb_parts_orderpart { get; set; }
    public List<Table_Parts_Vendor> tb_parts_vendor { get; set; }
    public List<Table_Parts_Warehouse> tb_parts_warehouse { get; set; }
    public List<Table_Parts_Part> tb_parts_part { get; set; }
}

在我的视图控制器中,我尝试对所有这些进行 1 次查询,然后一次性选择它们。我可以使用相同的查询单独执行此操作,然后选择表,然后选择 .ToList() ,它工作正常,但我访问数据库 5 次而不是一次。在此查询中选择列表时需要帮助。

public ActionResult PartsOrderDetails(int? id)
{
    if (id == null)
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);


    OrderDetailsViewModel vm = new OrderDetailsViewModel();

    vm = (from a in db.Table_Parts_Warehouse
              join b in db.Table_Parts_OrderPart
              on a.CQPN equals b.CQPN
              join c in db.Table_Parts_Part
              on b.PARTNO equals c.PARTNO
              join d in db.Table_Parts_Vendor
              on c.COMPANYID equals d.COMPANYID
              join e in db.Table_Parts_Order
              on b.ORDERID equals e.ORDERID
              orderby a.CQPN ascending
              where b.ORDERID == id
              select new OrderDetailsViewModel
              {
                  tb_parts_order = e,
                  tb_parts_orderpart = b, //(.ToList)
                  tb_parts_vendor = d, //(.ToList)
                  tb_parts_warehouse = a, //(.ToList)
                  tb_parts_part = c //(.ToList)
              });

    return View(vm);

}

这显然不起作用,因为我无法获得这样的列表。我已经看到人们在 select new 中进行另一个查询,但我不想重复查询 5 次。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 您是否有理由为每个表使用模型。这将使您尝试做的事情变得更加困难。此外,最好让您的控制器保持清洁,并且应该在单独的服务类中完成查询
  • 对不起,我真的不明白你的意思。我需要显示订单的详细信息,并使用包含所有相关订购零件和供应商的表格以及仓库表和零件表中的其他详细信息来显示实际订单。我需要所有这些信息,所以我想我应该获取所有数据并通过视图模型发送。我可以使用 JS 并使用 ajax 获取数据,但我又多次访问数据库。只是想提高性能。
  • 这显然行不通,因为我无法获得这样的列表你能详细说明一下吗?你为什么这么认为?
  • 刚刚给了你我项目的sn-p。我认为你应该追求类似的东西
  • 谢谢EasyE,我只用过这个实体数据库linq查询,还没有深入sqlconnection。我想我遇到的主要问题是我有 1 个项目是单个条目,而其他 4 个项目是我的视图模型中的列表。我可以只使用将要显示的数据,而不是使用整个表格,这可能是个好主意。但是我仍然会遇到同样的问题,订单是单项,所有的部分都是一个列表。真的,我只是在问如何使用我的查询并在选择新的添加代码中允许我将这些表作为列表获取。

标签: c# mysql asp.net-mvc linq


【解决方案1】:

这是我之前项目中的代码 sn-p。你可以从这个例子中得到一个好主意。出于调试目的,最好不要在控制器中进行查询。我创建了一个服务类。

服务类

   public static List<RetrivalQueryModel> GetPartner()
    {
        List<RetrivalQueryModel> partnerList = new List<RetrivalQueryModel>();
        using (SqlConnection connection = new SqlConnection(_constring))
        {
            StringBuilder sqlCommandBuilder = new StringBuilder();

            sqlCommandBuilder.Append("SELECT Partner.PartnerId, (Staff.Forename+ ','+Staff.Surname) AS Name FROM tblpartner Partner JOIN tblstaff Staff ON Staff.StaffId = Partner.StaffId Where Partner.Suspended = 0 ORDER BY Staff.Forename , Staff.Surname "); //will search only for active partners, take away Partner.Suspended to show all
            SqlCommand sqlCommand = new SqlCommand(sqlCommandBuilder.ToString(), connection);
            try
            {
                connection.Open();
                SqlDataReader reader = sqlCommand.ExecuteReader();
                while (reader.Read())
                {
                    try
                    {
                        RetrivalQueryModel partner = new RetrivalQueryModel();
                        partner.Partner = reader.GetString(1);
                        partner.PartnerId = reader.GetInt32(0);

                        partnerList.Add(partner);
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex);
                    }
                }
                reader.Close();
                connection.Close();
            }
            catch (Exception ex)
            {
                log.Error(ex);
            }
        }
        return partnerList;
    }

控制器

public JsonResult GetPartnerList()
    {
        List<RetrivalQueryModel> rtnList = PMService.GetPartner();
        JsonResult result = new JsonResult();
        result.Data = rtnList;
        result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        return result;
    }

型号

namespace EngagementRetrival.Models
{
public class RetrivalQueryModel
{
    public string JobStatus { get; set; }
    public int JobStatusID { get; set; }
    public string Market { get; set; }
    public int MarketId { get; set; }
    public string Office { get; set; }
    public int OfficeId { get; set; }
    public string Partner { get; set; }
    public int PartnerId { get; set; }
}

}

【讨论】:

    【解决方案2】:

    对于任何关心的人,我想通了。其实很容易。只是不要尝试使用 select new OrderDetailsViewModel 在您的 linq 查询中执行此操作。只需将查询作为列表抓取,遍历它们并添加到您的列表中。

    public ActionResult PartsOrderDetails(int? id)
    {
        if (id == null)
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    
        OrderDetailsViewModel vm = new OrderDetailsViewModel();
    
        var query = (from a in db.Table_Parts_Warehouse
                     join b in db.Table_Parts_OrderPart
                     on a.CQPN equals b.CQPN
                     join c in db.Table_Parts_Part
                     on b.PARTNO equals c.PARTNO
                     join d in db.Table_Parts_Vendor
                     on c.COMPANYID equals d.COMPANYID
                     orderby a.CQPN ascending
                     where b.ORDERID == id
                     select new
                     {
                         tb_parts_orderpart = b,
                         tb_parts_vendor = d,
                         tb_parts_warehouse = a,
                         tb_parts_part = c
                     }).ToList();
    
        vm.tb_parts_order = db.Table_Parts_Order.Find(id);
        vm.tb_parts_orderpart = new List<Table_Parts_OrderPart>();
        vm.tb_parts_part = new List<Table_Parts_Part>();
        vm.tb_parts_vendor = new List<Table_Parts_Vendor>();
        vm.tb_parts_warehouse = new List<Table_Parts_Warehouse>();
    
        for (int i = 0; i < query.Count(); i++)
        {
            vm.tb_parts_orderpart.Add(query[i].tb_parts_orderpart);
            vm.tb_parts_part.Add(query[i].tb_parts_part);
            vm.tb_parts_vendor.Add(query[i].tb_parts_vendor);
            vm.tb_parts_warehouse.Add(query[i].tb_parts_warehouse);
        }
    
       return View(vm);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多