将数据添加到列表中的列表中,列表中包含当前列表中的项目

时间:2015-04-20 16:46:49

标签: c# linq

我想选择一个where语句,将项添加到只有产品代码匹配的列表中。我有它所以它得到了销售中出售的所有产品,但我希望有声明只能获得此次销售中的产品。

PS:这很难解释

模型

public class userSales
{
    public string Name { get; set; }
    public string UserName { get; set; }
    public int Sale_Id { get; set; }
    public int CostumerID { get; set; }
    public string Sale_Date { get; set; }
    public string Paid { get; set; }
    public Nullable<int> Sale_Cost { get; set; }
    public string Discount_Code { get; set; }
    public List<SaleProduct> saleProductsList { get; set; }        
}

public class SaleProduct
{
    public int SaleID { get; set; }
    public string ProductCode { get; set; }
    public int ProductCount { get; set; }
    public string Image_Path { get; set; }
    public string Shoot_Date { get; set; }
    public string Shoot_Info { get; set; }
}

Linq声明我遇到了麻烦:

var test = (from _ClientData in db.ClientDatas
                        join _salesInfo in db.Sales_Infoes
                        on _ClientData.CostumerID
                        equals _salesInfo.CostumerID
                        where _ClientData.UserName == _userName
                        select new userSales()
                        {
                            CostumerID = _ClientData.CostumerID,
                            Name = _ClientData.Name,
                            UserName = _ClientData.UserName,
                            Sale_Id = _salesInfo.Sale_Id, // This is the item i would like to use in my were statement
                            Sale_Date = _salesInfo.Sale_Date,
                            Sale_Cost = _salesInfo.Sale_Cost,
                            Discount_Code = _salesInfo.Discount_Code,
                            Paid = _salesInfo.Paid,

                            // Problem here
                            saleProductsList = db.SaleProducts.Where()
                        }).ToList();

基于答案得到了这个:

var reult = db.ClientDatas.Where(a => a.UserName == _userName)
              .Join(db.Sales_Infoes,
                    a => a.CostumerID,
                    b => b.CostumerID,
                    (a, b) => new userSales()
                    {
                        CostumerID = a.CostumerID,
                        Discount_Code = b.Discount_Code,
                        Sale_Cost = b.Sale_Cost,
                        Sale_Id= b.Sale_Id,
                        Name = a.Name,
                        Sale_Date = b.Sale_Date,
                        UserName = a.UserName,
                        Paid = b.Paid,
                        saleProductsList = db.SaleProducts.Where(c => c.SaleID == b.Sale_Id).ToList()
                    }).ToList();

1 个答案:

答案 0 :(得分:0)

你不是在寻找一个地方,你正在寻找一个联盟。在单个表上过滤结果的位置,连接会交叉两个表,这实际上就是您想要的表。

var result = db.Sales_Infoes.Where(x => x.UserName == _userName)
        .Join(db.ClientDatas,
        x => x.Sale_Id,
        y => y.Sale_id,
        (x, y) => new userSales() {
                // x is SalesInfo  obj y is ClientDatas obj do assignement here
            Name = y.Name,
            Sale_Date = y.Sale_date     
         }).ToList();

我还没有机会测试,但这是基本想法。你不需要在语句中使用select,因为我传入join的最后一个参数是lambda (x, y) => ...,在这种情况下x和y是每个表的当前行(我们&# 39;我们已经将我们的位置应用到用户销售表,然后将这些结果加入到salesproduct表中,因此无论您想做什么投影都会在那里进行。上面的另外两个方法是告诉连接哪些字段要比较,它是&#39;键选择器&#39;每个表的lambda表达式。