C# 在foreach循环中获取数据后,如何返回预排序的数据?

C# 在foreach循环中获取数据后,如何返回预排序的数据?,c#,sql,asp.net-mvc,C#,Sql,Asp.net Mvc,首先,我要抓取客户ID。然后,我得到与该客户ID关联的所有发票。我想返回所有按发票编号降序排列的数据。这是我的密码: var rvInvoices = (from i in db.QB_INVOICES_HEADER where i.ClientID == cId select i).ToList(); foreach (var itm in rvInvoices) { InvoiceMod

首先,我要抓取客户ID。然后,我得到与该客户ID关联的所有发票。我想返回所有按发票编号降序排列的数据。这是我的密码:

var rvInvoices =
             (from i in db.QB_INVOICES_HEADER
                where i.ClientID == cId
                select i).ToList();
foreach (var itm in rvInvoices)
{
        InvoiceModel cm = new InvoiceModel()
        {
                InvoiceNumber = itm.InvoiceNumber,
                InvoiceSentDt = itm.InvoiceSentDt,
                InvoiceDt = itm.InvoiceDt,
                Amount = itm.Amount,
                Term = itm.Term,
                ClientName = itm.CI_CLIENTLIST.ClientName
        };

        listInvoices.Add(cm);
}

return listInvoices;

您应该尝试以下方法:

var rvInvoices =
               (from i in db.QB_INVOICES_HEADER
                where i.ClientID == cId
                select i).OrderByDescending(x => x.InvoiceNumber);

我看不出您需要调用
.ToList()

的原因。您应该尝试以下方法:

var rvInvoices =
               (from i in db.QB_INVOICES_HEADER
                where i.ClientID == cId
                select i).OrderByDescending(x => x.InvoiceNumber);

我看不出您需要调用
.ToList()

的原因您应该在数据库而不是客户端上订购它们:

var rvInvoices = db.QB_INVOICES_HEADER
    .Where(i => i.ClientID == cId)
    .OrderByDescending(i => i.InvoiceNumber);

您应该在数据库而不是客户机上订购:

var rvInvoices = db.QB_INVOICES_HEADER
    .Where(i => i.ClientID == cId)
    .OrderByDescending(i => i.InvoiceNumber);

你可以在三个地方下单

  • 在初始查询中
  • 在foreach的
    中,或
  • 返回中
  • 备选案文1:

    var rvInvoices =
        (from i in db.QB_INVOICES_HEADER
        where i.ClientID == cId
        select i).OrderByDescending(i => i.InvoiceNumber).ToList();
    
    备选案文2:

    foreach(rvInvoices.OrderByDescending中的var itm(i=>i.InvoiceNumber))

    备选案文3:

    返回列表invoices.OrderByDescending(i=>i.InvoiceNumber.ToList()


    我建议您选择路线1,因为它将在数据库级别运行订单。

    您可以在三个位置执行订单

  • 在初始查询中
  • 在foreach的
    中,或
  • 返回中
  • 备选案文1:

    var rvInvoices =
        (from i in db.QB_INVOICES_HEADER
        where i.ClientID == cId
        select i).OrderByDescending(i => i.InvoiceNumber).ToList();
    
    备选案文2:

    foreach(rvInvoices.OrderByDescending中的var itm(i=>i.InvoiceNumber))

    备选案文3:

    返回列表invoices.OrderByDescending(i=>i.InvoiceNumber.ToList()


    我建议采用路线1,因为它将在数据库级别运行订单。

    您当前使用的方法创建多个列表,具有显式的
    foreach
    循环,并且需要对其输出进行排序。只需创建一个列表,无显式循环,并由数据库为您排序即可:

    return
        (from i in db.QB_INVOICES_HEADER
         where i.ClientID == cId
         // have the database do the sorting
         orderby i.InvoiceNumber descending
         select i)
         // break out of the DB query to make InvoiceModel
        .ToEnumerable()
        .Select(itm => new InvoiceModel()
        {
            InvoiceNumber = itm.InvoiceNumber,
            InvoiceSentDt = itm.InvoiceSentDt,
            InvoiceDt = itm.InvoiceDt,
            Amount = itm.Amount,
            Term = itm.Term,
            ClientName = itm.CI_CLIENTLIST.ClientName
        })
         // only create one list as the last step
        .ToList();
    

    当前使用的方法创建多个列表,具有显式的
    foreach
    循环,并且需要对其输出进行排序。只需创建一个列表,无显式循环,并由数据库为您排序即可:

    return
        (from i in db.QB_INVOICES_HEADER
         where i.ClientID == cId
         // have the database do the sorting
         orderby i.InvoiceNumber descending
         select i)
         // break out of the DB query to make InvoiceModel
        .ToEnumerable()
        .Select(itm => new InvoiceModel()
        {
            InvoiceNumber = itm.InvoiceNumber,
            InvoiceSentDt = itm.InvoiceSentDt,
            InvoiceDt = itm.InvoiceDt,
            Amount = itm.Amount,
            Term = itm.Term,
            ClientName = itm.CI_CLIENTLIST.ClientName
        })
         // only create one list as the last step
        .ToList();
    

    既然可以在数据库中排序,为什么还要在内存中排序呢?这类事情通常做得更好。看看这页上的其他答案。既然可以在数据库中排序,为什么还要在内存中排序呢?这类事情通常做得更好。看看这页上的其他答案。谢谢!我试试第一种方法。谢谢!我试试第一种方法。