C# 将join和groupby之后的结果与DataTable和List合并<;对象>;

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

我想在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"].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()
             };