用Linq数据填充多对多类

3

这是我的 C# 代码

var result = db.Quotes_Items_Suppliers
            .Include(tbl => tbl.tblItems)
            .Include(tbl => tbl.tblQuotes)
            .Include(tbl => tbl.tblSuppliers).GroupBy(tbl => new { tbl.tblQuotes, tbl.tblSuppliers, tbl.tblItems })
            .Select(grouped => new QuoteViewModel
            {
                Quote = new Quote { ID = grouped.Key.tblQuotes.ID,
                                    QuoteNo = grouped.Key.tblQuotes.QuoteNo ,
                                    Date = grouped.Key.tblQuotes.RequestDate},

                Supplier = new Supplier { ID = grouped.Key.tblSuppliers.ID,
                                          Name = grouped.Key.tblSuppliers.Supplier,
                                          TelNo = grouped.Key.tblSuppliers.Tel },

                Item = new Item { ID = grouped.Key.tblItems.ID,
                                  Name = grouped.Key.tblItems.Name,
                                  PartNo = grouped.Key.tblItems.PartNo },
                Quantity = grouped.Sum(tbl => tbl.Quantity),
                Price = grouped.Sum(tbl => tbl.Price)
            });

            AllQuotes AllQuotes = new AllQuotes();
            foreach (var quoteId in db.Quotes_Items_Suppliers.Select(qis => qis.QuoteID).Distinct())
            {
                int id = quoteId;
                foreach (var row in result.Where(row => row.Quote.ID == id))
                {
                    Request Req = new Request();
                    Req.Quote = new Quote { ID = row.Quote.ID,
                                    QuoteNo = row.Quote.QuoteNo,
                                    Date = row.Quote.Date };
                    // should this be another foreach loop to select all the suppliers for this quote?
                    Req.Suppliers = new Supplier { ID = row.Supplier.ID,
                                              Name = row.Supplier.Name,
                                              TelNo = row.Supplier.TelNo };
                    // again should this be another foreach loop to select all the items for this quote?
                    Req.Items = new Item { ID = row.Item.ID,
                                      Name = row.Item.Name,
                                      PartNo = row.Item.PartNo };
                    Req.Quantity = row.Quantity;
                    Req.Price = row.Price;
                    AllQuotes.Reqs.Add(Req);
                }
            }

这是我的类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ITAPP.Models
{
    public class Quote
    {
        public int ID { get; set; }
        public string QuoteNo { get; set; }
        public DateTime? Date { get; set; }
    }
    public class Item
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string PartNo { get; set; }
    }
    public class Supplier
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string TelNo { get; set; }
    }
    public class QuoteViewModel
    {
        public Quote Quote { get; set; }
        public Item Item { get; set; }
        public Supplier Supplier { get; set; }
        public int Quantity { get; set; }
        public decimal Price { get; set; }
    }

    public class Request
    {
        public Quote Quote { get; set; }
        public Item Items { get; set; }
        public Supplier Suppliers { get; set; }
        public int Quantity { get; set; }
        public decimal Price { get; set; }
    }
    public class AllQuotes
    {
        public List<Request> Reqs { get; set; }
    }
}

我不确定自己是否理解正确,实际上我知道我没有。

我认为我需要一个供应商列表和每个请求中的项目列表,然后对于每个报价项目和每个报价供应商,我都要使用foreach将数据添加到这些列表中。是这样吗?

基本上我应该有:- 报价 x数量的报价项目 x数量的为每个项目提供报价及其价格的供应商

希望以上内容足以让人们理解我想做的事情?

谢谢

编辑:样例

以下是我希望数据看起来像的样子

IS0001 20/11/2013

           | HP DL360p  | Samsung 840 Pro 256GB | Total 
ITSupplier | 1132       | 477                   | 1609
ITComms    | 1160       | 510                   | 1670
ITSol      | 1135       | 160                   | 1295

这里是表格布局。
tblQuotes
ID | QuoteNo | Date

tblItems
ID | Itemname | Part No

tblSuppliers
ID | SupplierName | TelNo

tblQuotes_Items_Suppliers
ID | QuoteID | ItemID | SupplierID | Quantity | Price

每个报价应该显示每个供应商的每个项目的价格。

请解释一下,最好用一个简单的例子来说明你想要查询的输出结果以及输入数据的样子。仅从上面的代码中很难理解你的数据库是如何设计的。 - theyetiman
我现在添加了一个示例,如果有帮助的话?谢谢。 - AlexW
我已经提供了一个答案,希望它是你想要的。从外部的角度来看,这是一个相当复杂的情况,有很多未知因素。 - theyetiman
看起来你应该按QuoteID分组,然后在该组内按ItemId分组。但是示例数据并没有帮助,因为它与你的实体之间的关系不清楚。 - Gert Arnold
1个回答

0

我认为你不需要进行任何分组。如果你需要将表格中的所有内容都展开,那么你需要在你的视图模型中包含所有细节数据。要计算总数,只需在你的视图中执行这个操作。

因此,请按照以下方式创建你的视图模型(注意:我完全不使用你的QuoteViewModel类。我将使用AllQuotes类作为你的视图模型):

var viewmodel = new AllQuotes();

viewmodel.Reqs = db.Quotes_Items_Suppliers
        .Include(tbl => tbl.tblItems)
        .Include(tbl => tbl.tblQuotes)
        .Include(tbl => tbl.tblSuppliers)
        .Select(tbl => new Request
        {
            Quote = new Quote { ID = tbl.tblQuotes.ID,
                                QuoteNo = tbl.tblQuotes.QuoteNo ,
                                Date = tbl.tblQuotes.RequestDate},

            Supplier = new Supplier { ID = tbl.tblSuppliers.ID,
                                      Name = tbl.tblSuppliers.Supplier,
                                      TelNo = tbl.tblSuppliers.Tel },

            Item = new Item { ID = tbl.tblItems.ID,
                              Name = tbl.tblItems.Name,
                              PartNo = tbl.tblItems.PartNo },
            Quantity = tbl.Quantity,
            Price = tbl.Price
        }).ToList();

基本上只是你的数据库表的副本。

然后在你的视图中,只需创建一个表格并在其中执行所有必要的分组。这将为每个引用创建一个表格

例如:

@foreach (var quote in Model.Reqs.GroupBy(r => r.Quote.ID).OrderBy(g => g.First().Quote.QuoteNo))
{
    <h3>@quote.First().Quote.QuoteNo @quote.First().Quote.Date</h3>
    <table>
        <thead>
            <tr>
                <th><!--blank top-left cell--></th>
                @foreach (var item in quote.GroupBy(r => r.Item.ID).OrderBy(g => g.First().Item.Name))
                {
                    <th>@item.First().Item.Name</th>
                }
                <th>Total Price</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var supp in quote.GroupBy(r => r.Supplier.ID))
            {
                <tr>
                    <td>@supp.First().Supplier.Name</td>                            
                    @foreach (var item in supp.OrderBy(r => r.Item.Name))
                    {
                        <td>@item.Price</td>
                    }
                    <td>@supp.Sum(r => r.Price)</td>
                </tr>
            }
        </tbody>
    </table>
}

请注意,以下内容都是我凭记忆写的,因为我没有IDE或您的数据库在手边,所以可能存在语法错误。希望这能让您朝着正确的方向前进。

编辑

另外,请注意,我假设所有供应商都已经为所有项目报价。


你能告诉我在哪里添加foreach和groupby以显示多个引用吗?谢谢。 - AlexW
也许尝试将 var req 更改为 Request req - theyetiman
尝试将其更改为 @model ITAPP.Models.AllQuotes - theyetiman
嗨,我想为查询添加一个where语句以获取一个报价,但我不知道在哪里添加.Where语句,我尝试了几个地方,但是出现了错误,你能给我展示一下吗?谢谢。 - AlexW
你可以在多个地方完成它,但我会在.Select(...)语句之前完成。例如:(...include statements...).Where(...).Select(tbl => new Request - theyetiman
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接