【问题标题】:Populating ViewModel from multiple tables in SQL从 SQL 中的多个表填充 ViewModel
【发布时间】:2016-11-30 20:05:32
【问题描述】:

我正在尝试创建一个查询 AdventureWorks2012 数据库并使用 Jquery ui datepicker 基于日期时间范围填充强类型表的 SPA。

我遇到的问题是它返回所有相同的重复记录。

Duplicate Records

感谢您的帮助!

_Layout查看代码:

 <div>
    <h2>Pick a date range:</h2>
    <form action='@Url.Action("GetOrders","Home")' method="post">
    <label for="from">From</label>
    <input type="text" id="from" name="startDate">
    <label for="to">To</label>
    <input type="text" id="to" name="endDate">
    <input type='submit' value='Set Range' />
    </form>
 </div>

$( function() {
var dateFormat = "mm/dd/yy",
  from = $( "#from" )
    .datepicker({
      defaultDate: "+1w",
      changeMonth: true,
      numberOfMonths: 3
    })
    .on( "change", function() {
      to.datepicker( "option", "minDate", getDate( this ) );
    }),
  to = $( "#to" ).datepicker({
    defaultDate: "+1w",
    changeMonth: true,
    numberOfMonths: 3
  })
  .on( "change", function() {
    from.datepicker( "option", "maxDate", getDate( this ) );
  });

function getDate( element ) {
  var date;
  try {
    date = $.datepicker.parseDate( dateFormat, element.value );
  } catch( error ) {
    date = null;
  }

  return date;
}});

GetOrders.cshtml 代码:

@model System.Collections.Generic.List<ApexAssignment.ViewModels.OrderViewModel>
@foreach (var item in Model)
{
    <tr>
        <td class="tg-yw4l">
            @item.Store
        </td>
        <td class="tg-yw4l">
            @item.Customer
        </td>
        <td class="tg-yw4l">
            @item.AccountNumber
        </td>
        <td class="tg-yw4l">
            @item.InvoiceNumber
        </td>
        <td class="tg-yw4l">
            @item.CustomerPO
        </td>
        <td class="tg-yw4l">
            @item.OrderDate
        </td>
        <td class="tg-yw4l">
            @item.DueDate
        </td>
        <td class="tg-yw4l">
            @item.InvoiceTotal
        </td>
        <td class="tg-yw4l">
            @item.ProductNumber
        </td>
        <td class="tg-yw4l">
            @item.Quantity
        </td>
        <td class="tg-yw4l">
            @item.UnitNet
        </td>
</tr>
}

控制器方法代码:

 [HttpPost]
    public ActionResult GetOrders(DateTime startDate, DateTime endDate)
    {
        var model = (from p in db.People
                     from pd in db.Products
                     from so in db.SalesOrderDetails
                     from sh in db.SalesOrderHeaders
                     where sh.OrderDate > startDate && sh.OrderDate < endDate
                     from s in db.Stores
                     from c in db.Customers
                     select new OrderViewModel()
                     {
                         AccountNumber = sh.AccountNumber,
                         Customer = p.FirstName + " " + p.LastName,
                         Store = s.Name,
                         ProductNumber = pd.ProductNumber,
                         DueDate = sh.DueDate,
                         CustomerPO = sh.PurchaseOrderNumber,
                         Quantity = so.OrderQty,
                         InvoiceNumber = sh.SalesOrderNumber,
                         UnitNet = so.UnitPrice,
                         InvoiceTotal = sh.TotalDue,
                         OrderDate = sh.OrderDate
                     });

        return View(model.ToList());
    }

【问题讨论】:

  • 您需要将连接添加到您的 linq
  • 我认为这是一种交叉连接尝试使用内连接或使用连接语句左连接

标签: sql entity-framework linq model-view-controller


【解决方案1】:
var model = db.SalesOrderDetails
    .Where(e => e.SalesOrderHeader.OrderDate > startDate)
    .Where(e => e.SalesOrderHeader.OrderDate < endDate)
    .Join(db.Products, order => order.ProductID, 
        product => product.ProductID, (order, product) => new
        {
            Quantity = order.OrderQty,
            UnitNet = order.UnitPrice,
            DueDate = order.SalesOrderHeader.DueDate,
            CustomerPO = order.SalesOrderHeader.PurchaseOrderNumber,
            InvoiceNumber = order.SalesOrderHeader.SalesOrderNumber,
            InvoiceTotal = order.SalesOrderHeader.TotalDue,
            OrderDate = order.SalesOrderHeader.OrderDate,
            AccountNumber = order.SalesOrderHeader.AccountNumber,
            Store = order.SalesOrderHeader.Customer.Store.Name,
            Customer = order.SalesOrderHeader.Customer.Person.FirstName + " " +
                        order.SalesOrderHeader.Customer.Person.LastName,
            ProductNumber = product.ProductNumber
        }).ToList();

【讨论】:

  • 感谢您的回复。所以在 new 关键字之后我会做 OrderViewModel()?
猜你喜欢
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多