4

雇用主の社内システムをaspからasp.net MVCに移行する前に、MVCとViewModelの知識を開発するためのテストとして典型的な請求システムを使用しています。

ViewModels がビューに情報を表示するための推奨される方法であることは知っています。

テーブル: Invoice、InvoiceItem、Payment、PaymentInvoice

Invoice と InvoiceItem はリンクされており、Payment (支払い全体を記録する) と PaymentInvoice (Payment がカバーする請求書をリストする) もリンクされています。

ViewModel に表示してもらいたい:

InvoiceId CustomerName 請求書の合計 (数量 X UnitPrice プラス VAT) AmountAllocated (PaymentInvoice テーブルから) 未払い (TotalofInvoice - AmountAllocated)

したがって、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; }
}

私の問題は、Payment および PaymentInvoice テーブルを Invoice および InvoiceItem テーブルにリンクする方法にあるため、コントローラーで LINQ クエリを使用してビューモデルに「フラット化されたデータ」を入力できます。

私もLINQクエリで迷っています-LinqPadで私は持っています:

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 {...into ViewModel????...}

...しかし、その後どこに行くのかわかりません。

編集-私が持っている最も近いのは、これを行うための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

ありがとうございました、

マーク

4

1 に答える 1

2

あなたの Linq クエリはほぼ完璧だと思います。新しい ViewModel を選択するだけです。

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 = ...
};
于 2013-05-16T11:53:35.437 に答える