2011-07-13 35 views
1

当我使用Linq中的左连接为DataSet时,我卡住的错误“值不能为空参数名称行”。左连接Linq并使用变量为其他连接

以下是数据和linq查询。

  • DataRowCollection - 项目(列 - ITEM_ID,SKU,数量)
  • DataRowCollection - 优惠(色谱柱 - ITEM_ID,Promotion_Id)
  • DataRowCollection - 组分(色谱柱 - COMPONENT_ID,Promotion_id)
  • DataRowCollection - 金额(列 - Component_id,Amount_Text,货币)

 var q = 
      from Item in items 
      join promotion in promotions 
       on Item.Field<int>("Item_id") equals promotion.Field<int?>("Item_id") into promo 
      from promotion in promo.DefaultIfEmpty() 
      join disccomponent in components 
       on promotion.Field<int>("Promotion_Id") equals disccomponent.Field<int?>("Promotion_Id") 
      join discamounts in amounts 
       on disccomponent.Field<int>("Component_id") equals discamounts.Field<int?>("Component_id") 
      where disccomponent.Field<string>("Type") == "Principal" 
      select new 
      { 
       SKU = Item.Field<string>("SKU"), 
       Quantity = Item.Field<string>("Quantity"), 
       DiscountAmount = discamounts.Field<string>("Amount_Text"), 
       DiscountCurrency = discamounts.Field<string>("currency") 
      }; 

我需要得到以下几点:

  • SKU,数量和折扣的细节对于具有打折商品
  • SKU,数量为不具有任何折扣

代码工作没有项目当所有物品都有折扣时左外连接,但如果任何物品没有任何折扣,则跳过该物品,因此我不得不使用左外连接。

任何帮助,高度赞赏。请让我知道是否需要澄清。

在此先感谢。

回答

0

谢谢大家对你的帮助。我通过将它分解成下面的2个不同的linq查询来完成这项工作。

第一个查询得到推广数据的VAR

 var promoData = 
       from promotion in promotions 
       join component in components 
        on promotion.Field<int>("Promotion_Id") equals component.Field<int?>("Promotion_Id") 
       join amount in amounts 
        on component.Field<int>("Component_id") equals amount.Field<int?>("Component_id") 
       where component.Field<string>("Type") == "Principal" 
       select new 
       { 
        Item_id = promotion.Field<int?>("Item_id"), 
        Promotion_id = promotion.Field<int>("Promotion_Id"), 
        DiscountAmount = amount == null ? "" : amount.Field<string>("Amount_Text"), 
        DiscountCurrency = amount == null ? "" : amount.Field<string>("currency") 
       }; 

第二个查询使用促销VAR简化查询并获得resuls

 var q = 
      from Item in items 
      join promotion in promoData 
       on Item.Field<int>("Item_id") equals promotion.Item_id into promo 
       from promoJoin in promo.DefaultIfEmpty() 
      select new 
      { 
       SKU = Item.Field<string>("SKU"), 
       Quantity = Item.Field<string>("Quantity"), 
       DiscountAmount = promoJoin != null ? promoJoin.DiscountAmount : "0", 
       DiscountCurrency = promoJoin != null ? promoJoin.DiscountCurrency : "" 
      }; 

这种方法适用完美地获得所有物品,无论他们是否有促销活动。我仍然在考虑是否可以在单个查询中做同样的事情:) 现在将其标记为答案,如果有人想出其他更好的方法,那么标记就是这样。

0

我认为你试图访问属性为null discamounts。也许你的选择应新这个样子......

select new 
{ 
    SKU = Item.Field<string>("SKU"), 
    Quantity = Item.Field<string>("Quantity"), 
    DiscountAmount = discamounts == null ? "" : discamounts.Field<string>("Amount_Text"), 
    DiscountCurrency = discamounts == null ? "" : discamounts.Field<string>("currency") 
}; 
+0

试过这个,但仍然是相同的错误“值不能为空参数名称:行” –

0

给你的使用into加入一个名称,就可以使用DefaultIfEmpty。像这样的事情(看在声明的最后joinfrom表达)

var q = 
    from Item in items 
    join promotion in promotions 
     on Item.Field<int>("Item_id") equals promotion.Field<int?>("Item_id") into promo 
    from promotion in promo.DefaultIfEmpty() 
    join disccomponent in components 
     on promotion.Field<int>("Promotion_Id") equals disccomponent.Field<int?>("Promotion_Id") 
    join discamounts in amounts 
     on disccomponent.Field<int>("Component_id") equals discamounts.Field<int?>("Component_id") into DiscamountJoin 
    from discamount in DiscamountJoin.DefaultIfEmpty() 
    where disccomponent.Field<string>("Type") == "Principal" 
    select new 
    { 
     SKU = Item.Field<string>("SKU"), 
     Quantity = Item.Field<string>("Quantity"), 
     DiscountAmount = discamount.Field<string>("Amount_Text"), 
     DiscountCurrency = discamount.Field<string>("currency") 
    }; 
+0

感谢您的输入,但它失败,同样的错误。我把它分成2个linq查询并且它可以工作。将发布解决方案。请检查并看看你能否帮助我做得更好。 –