Asp.net mvc 在Asp.NETMVC中表示4个链接表的Viewmodel和LINQ查询

Asp.net mvc 在Asp.NETMVC中表示4个链接表的Viewmodel和LINQ查询,asp.net-mvc,linq,linq-to-sql,viewmodel,Asp.net Mvc,Linq,Linq To Sql,Viewmodel,我正在使用一个典型的发票系统作为开发MVC和ViewModel知识的测试,然后将我的雇主内部系统从asp迁移到asp.net MVC 我知道ViewModels是在视图中显示信息的推荐方式-因此我希望获得一些帮助“展平”viewmodel以实现以下目的: 表:发票、发票项、付款、付款发票 发票和发票项被链接,付款(记录总体付款)和付款发票(列出付款涵盖的发票)也被链接 我想要一个ViewModel向我展示: 发票ID 客户名称 发票总额(数量X单价加增值税) 未分配金额(来自PaymentInv

我正在使用一个典型的发票系统作为开发MVC和ViewModel知识的测试,然后将我的雇主内部系统从asp迁移到asp.net MVC

我知道ViewModels是在视图中显示信息的推荐方式-因此我希望获得一些帮助“展平”viewmodel以实现以下目的:

表:发票、发票项、付款、付款发票

发票和发票项被链接,付款(记录总体付款)和付款发票(列出付款涵盖的发票)也被链接

我想要一个ViewModel向我展示:

发票ID 客户名称 发票总额(数量X单价加增值税) 未分配金额(来自PaymentInvoice表) 未分配(总票数-未分配票数)

因此,我认为我的ViewModel应该是:

public class InvoiceViewModel
{
    public Int InvoiceId { get; set; }
    public string CustomerName { get; set; }
    public decimal TotalofInvoice { get; set; }
    public decimal AmountAllocated { get; set; }
    public decimal Outstanding { get; set; }
}
我的域模型是:

public class Invoice
{

    public int InvoiceId { get; set; }
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public string Email { get; set; }
    public DateTime InvDate { get; set; }
    public IList<InvoiceItem> InvoiceItems { get; set; }
}

public class InvoiceItem
{
    public int InvoiceItemId { get; set; }
    public int InvoiceId { get; set; }
    public string Item { get; set; }
    public string Description { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal VAT { get; set; }
    public virtual Invoice Invoice { get; set; }

    // calculated fields
    public decimal Total
    {
        get { return Quantity * UnitPrice; }
    }
    public decimal VATAmount
    {
        get { return TotalPlusVAT - Total; }
    }
    public decimal TotalPlusVAT
    {
        get { return Total * (1 + VAT / 100); }
    }
}

public class Payment
{
    public int PaymentId { get; set; }
    public int CustomerId { get; set; }
    public DateTime DateReceived { get; set; }
    public decimal TotalReceived { get; set; }
    public IList<PaymentInvoice> PaymentInvoices { get; set; }
}

public class PaymentInvoice
{
    public int PaymentInvoiceId { get; set; }
    public int PaymentId { get; set; }
    public decimal AmountAllocated { get; set; }
    public int InvoiceId { get; set; }
    public virtual Payment Payment { get; set; }
}
…但不确定之后该去哪里

编辑-我得到的最接近的Sql是:

SELECT     Invoices.InvoiceId, 
           Invoices.CustomerName, 
           (SUM(InvoiceItems.Quantity * InvoiceItems.UnitPrice)) AS TotalOfInvoice, 
           (SELECT     SUM(AmountAllocated) AS Expr1
                          FROM         PaymentInvoices
                          WHERE     (InvoiceId = Invoices.InvoiceId)) AS AmountAllocated, 
           SUM(InvoiceItems.Quantity * InvoiceItems.UnitPrice) 
           - (SELECT     SUM(AmountAllocated) AS Expr1
                          FROM         PaymentInvoices
                          WHERE     (InvoiceId = Invoices.InvoiceId)) AS Outstanding
FROM         Invoices LEFT OUTER JOIN
                  InvoiceItems ON Invoices.InvoiceId = InvoiceItems.InvoiceId
GROUP BY Invoices.InvoiceId, Invoices.CustomerName
谢谢,


Mark

我认为您的Linq查询几乎完美您只需要选择新的ViewModels:

from c in Invoices
join i in InvoiceItems on c.InvoiceId equals i.InvoiceId
join pi in PaymentInvoices on c.InvoiceId equals pi.InvoiceId
select new InvoiceViewModel {
    InvoiceId = c.InvoiceId,
    CustomerName = c.CustomerName,
    TotalofInvoice = c.InvoiceItems.Sum(invoiceitem => invoiceitem.Total(),
    AmountAllocated = ...
    Outstanding = ...
};

您好@Kenneth-谢谢-我猜我的思路是对的,但我没有取得任何进展-我已经发布了工作SQL语句-我想知道是否有人可以帮助扩展我的Linq/Kenneths Linq,以展示该语句应该如何在Linq中转换为工作语句?谢谢,标记SQL和LINQ查询之间的区别是“内部联接”与“左外部联接”。在“LINQ left outer join”上进行一些谷歌搜索,以获得一些示例,例如感谢-使用它,我可以让它显示单个项目,但我希望在查询中对项目进行求和-我现在拥有的是:var invs=发票中的发票连接发票中的项目发票上的项目。InvoiceId等于项目。InvoiceId等于gj.DefaultIfEmpty()从gj.DefaultIfEmpty()中的子项目将gj转换为新的{invoice.CustomerName,costs=(子项目==null?0:子项目.UnitPrice)};(刚刚尝试了一个链接,看看是否可以正常工作)
from c in Invoices
join i in InvoiceItems on c.InvoiceId equals i.InvoiceId
join pi in PaymentInvoices on c.InvoiceId equals pi.InvoiceId
select new InvoiceViewModel {
    InvoiceId = c.InvoiceId,
    CustomerName = c.CustomerName,
    TotalofInvoice = c.InvoiceItems.Sum(invoiceitem => invoiceitem.Total(),
    AmountAllocated = ...
    Outstanding = ...
};