从前一行填充linq null data c#

时间:2011-10-13 02:30:23

标签: c# .net linq

我在列表中有账单明细,其中包含标题:
帐号,日期,服务号码,收费类别,详情,exgst,ingst,Detailsfill

栏目: - 帐号,日期,服务号码,收费类别,详情,exgst,ingst
 是唯一值,但列详细信息填充包含null。我想允许我的C#脚本为Detailsfill设置值,其中Detailsfill为null,然后从上一行插入数据,否则什么都不做。

请注意,当detailsfill列有任何文本时,Running total设置为1,但当detailsfill列为空时,继续从3增加1。

以下是我使用的脚本。

var result_set2 = (from a in result_set1
                   join b in
   (from x in result_set1a select x)
on
   new {col1 = a.id, col2 = a.account, col3 = a.date, col4 = a.service, col5 = a.chargecat } 
   equals
   new { col1 = b.id, col2 = b.account, col3 = b.date, col4 = b.service, col5 = b.chargecat } into outer
      from tb in outer.DefaultIfEmpty()
      where a.running_total1 !=  0
        where a.running_total1 != 2
        where a.chargecat != ""
                   select new
                   {
   running_total = a.running_total1,
   account = a.account,
   date = a.date,
   service = a.service,
   chargecat = a.chargecat,
   details = a.details,
   exgst = a.exgst,
   ingst = a.ingst,
   detailsfill = ((tb == null) ? "" : tb.details)
 }).ToList();

 foreach (var line in result_set2)
{
    mobilenet_writerfile.WriteLine(line);

}

2 个答案:

答案 0 :(得分:1)

这不是Linq保持先前值然后再使用它的正常操作。这并不是说你不能使用Linq工作,但是将这个逻辑保留在序列操作之外会更直接。在编写查询后,只需遍历结果即可。

var item = results.First();
foreach (var obj in results)
{
    if (obj.detailsfill == null) 
        obj.detailsfill = item.detailsfill;

    item = obj;
}

注意:如果第一项恰好在null中包含detailsfill,则在 包含值的序列中的第一项之前,您不会选择一个值。要预先获得第一个这样的项目,只需使用

var item = results.First(o => o.detailsfill != null);
// loop below

答案 1 :(得分:1)

听起来我需要一个相关的子查询来填充详细信息。这将是从您确定满足您的要求的任何参数的上下文中选择的形式。此主题的第二篇文章示例:http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/18da37b0-b40e-444e-8ec7-7bd343e0c799/ 您还可以在stackoverflow上找到其他示例:Is it possible to create a correlated subquery in LINQ?

编写上下文示例需要更多信息,但基本上它的外观如下:

Entities context = new Entities();
context.tbl.Where(t=>t.Id == someId)
    .Select(t=> new() {
        t.Id, 
        context.tbl2.First(tbl2=>tbl2.Id == t.Id).Value, //This is the subquery
        t.whatever});
相关问题