我在列表中有账单明细,其中包含标题:
帐号,日期,服务号码,收费类别,详情,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);
}
答案 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});