C# 将join和groupby之后的结果与DataTable和List合并<;对象>;
我想在DataTable和List之间组合LINQ联接的结果 这很好:C# 将join和groupby之后的结果与DataTable和List合并<;对象>;,c#,.net,linq,datatable,C#,.net,Linq,Datatable,我想在DataTable和List之间组合LINQ联接的结果 这很好: var lpYear = ( from a in _ds.Tables[0].AsEnumerable() join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c from d in c.DefaultIfEmpty() where DateTime.Parse(a["PURCHASEDATE"].T
var lpYear = (
from a in _ds.Tables[0].AsEnumerable()
join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c
from d in c.DefaultIfEmpty()
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("January 1, " + year)
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("December 31, " + year)
where LandingPages.Any(x => x.Code == a["OFFERINGKEY"].ToString())
orderby d.Title
select new {
title = d.Title,
price = a["PRICE"]
}).GroupBy(o => o.title)
.Select(o => new {
total = o.Sum(p => decimal.Parse(p.price.ToString())),
count = o.Count(),
title = o.Key
}
);
最后我得到的行包含“total | count | title
”
我想做的是添加更多的列。例如,LandingPage.URL
或LandingPage.code
。我试过这样做,但不起作用:
var lpYear = (
from a in _ds.Tables[0].AsEnumerable()
join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c
from d in c.DefaultIfEmpty()
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("January 1, " + year)
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("December 31, " + year)
where LandingPages.Any(x => x.Code == a["OFFERINGKEY"].ToString())
orderby d.Title
select new {
title = d.Title,
price = a["PRICE"],
url = d.URL,
code = d.Code
}).GroupBy(o => o.title)
.Select(o => new {
total = o.Sum(p => decimal.Parse(p.price.ToString())),
count = o.Count(),
title = o.Key,
url = o.Select(p=>p.url),
code = o.Select(p=>p.code)
}
);
这是url
和购买的的结果值:
System.Linq.Enumerable+WhereSelectEnumerableIterator`2[<>f__AnonymousType2`3[System.String,System.Object,System.String],System.String]
只是忘记了使用ToList()
,来枚举。。。执行o时的枚举。选择(…)
在纯LINQ中:
var lpYear = from o in (from a in _ds.Tables[0].AsEnumerable()
join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c
from d in c.DefaultIfEmpty()
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("January 1, " + year)
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("December 31, " + year)
where LandingPages.Any(x => x.Code == a["OFFERINGKEY"].ToString())
orderby d.Title
select new
{
title = d.Title,
url = d.URL,
price = a["PRICE"],
purchased = a["PURCHASEDATE"].ToString()
})
group o by o.title into g
select new
{
total = g.Sum(p => decimal.Parse(p.price.ToString())),
count = g.Count(),
title = g.Key,
url = (from p in g
select p.url).Distinct().Single(),
code = (from p in g
select p.code).Distinct().Single()
};
为什么不从头到尾使用LINQ语法(而不是扩展方法)?它可以简化查询多个部分之间的引用。当你说“它不起作用,到底是什么问题?”时,我尝试了各种扩展方法配置(我认为),使用.GroupBy()
和.Select()
似乎是做我需要的事情的唯一方法。您能提供一个示例吗?添加.ToList()
后,它会为“url”和“购买的”返回以下内容:System.Collections.Generic.List
1[System.String]`是的,这是正常行为,因为您正在进行分组。g可以包含多个具有不同价格或购买值的元素。如果你确定g组的所有元素的值都相同,用Single代替ToList。好的,明白了.Single()
产生了一个错误,但是.First()
工作得很好。您的“纯LINQ”示例也起作用,并且做了相同的事情(第14行缺少一个结尾)。谢谢你的帮助!首先要小心,因为它只接受枚举的第一个元素。事实上,当我说用Single()替换ToList()时,我错了(仅当每个组仅由1个元素组成时,它才起作用)。用Distinct().Single()替换它更为正确。实际上,在这种情况下,如果组中的所有价格都是相同的,并且所有购买的价值都不相等,则会引发错误(仅使用First()不会看到错误)。谢谢你的解释,这很有道理。另外,购买的
和价格
都是可怕的例子。我将要收集的真实数据是url
和code
等等-我已经更新了我的原始帖子以反映这一点。
var lpYear = (
from a in _ds.Tables[0].AsEnumerable()
join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c
from d in c.DefaultIfEmpty()
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("January 1, " + year)
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("December 31, " + year)
where LandingPages.Any(x => x.Code == a["OFFERINGKEY"].ToString())
orderby d.Title
select new {
title = d.Title,
url = d.URL,
price = a["PRICE"],
purchased = a["PURCHASEDATE"].ToString()
}).GroupBy(o => o.title)
.Select(g => new {
total = g.Sum(p => decimal.Parse(p.price.ToString())),
count = g.Count(),
title = g.Key,
url = g.Select(p=>p.url).Distinct().Single(),
code = g.Select(p=>p.code).Distinct().Single()
}
);
var lpYear = from o in (from a in _ds.Tables[0].AsEnumerable()
join b in LandingPages on a["OFFERINGKEY"].ToString() equals b.Code into c
from d in c.DefaultIfEmpty()
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("January 1, " + year)
where DateTime.Parse(a["PURCHASEDATE"].ToString()) >= DateTime.Parse("December 31, " + year)
where LandingPages.Any(x => x.Code == a["OFFERINGKEY"].ToString())
orderby d.Title
select new
{
title = d.Title,
url = d.URL,
price = a["PRICE"],
purchased = a["PURCHASEDATE"].ToString()
})
group o by o.title into g
select new
{
total = g.Sum(p => decimal.Parse(p.price.ToString())),
count = g.Count(),
title = g.Key,
url = (from p in g
select p.url).Distinct().Single(),
code = (from p in g
select p.code).Distinct().Single()
};