在Linq select中返回非聚合以及聚合

时间:2019-08-09 11:56:13

标签: c# asp.net linq core

试图将基本的SQL查询转换为Linq。

聚合返回正常,但非聚合未返回。

SeriesId,Amount和NumberOfTrades很完美。

Code和Isin不会引起错误,但是它们返回的是类型而不是数据。

我要转换的查询:

SELECT
  trans_series.id, 
    trans_series.number,
    trans_series.isin,
    SUM( trans_trades.amount ),
    COUNT( trans.series_id ) 
FROM
    trans_trades
INNER JOIN trans_series ON trans_series.id = trans_trades.series_id 
WHERE
    trans_trades.series_id  IN (
    17,
    18)
    AND trans_trades.first_party_id IS NULL
    AND trans_trades.status <> 'closed'
    AND trans_trades.status <> 'cancelled'
    GROUP BY trans_trades.series_id

方法:

public List<TotalByIsinViewModel> GetIssuerSeries()
        {
            _context = new MySQLDatabaseContext();

            var result = (from ts in _context.TradesSeries
                         join tts in _context.TradesTrades
                         on ts.Id equals tts.SeriesId
                         where myInClause.Contains(tts.SeriesId)
                         group new { ts, tts } by new { tts.SeriesId } into g
                         select new TotalByIsinViewModel
                         {
                             SeriesId = g.Key.SeriesId,
                             Code =  g.Select(i => i.tts.Number).Distinct().ToString(),
                             Isin = g.Select(i => i.ts.Isin).Distinct().ToString(),
                             Amount = (decimal?)g.Sum(pt => pt.tts.Amount),
                             NumberOfTrades = g.Count()
                         }).ToList();

            return result;
        }

视图模型:

    public class TotalByIsinViewModel
    { 
        public int SeriesId { get; set; }
        public string Code { get; set; }
        public string Isin { get; set; }
        public decimal? Amount { get; set; }
        public int NumberOfTrades { get; set; }
    }

我期望从“ number”和“ isin”列获得实际的不同varchar值,但是我在Razor页面的CS Onget中返回了这种类型的数据: https://b.imge.to/2019/08/09/QODVG.png

2 个答案:

答案 0 :(得分:1)

您需要的是:

Code =  g.First().tts.Number,
Isin = g.First()ts.Isin,

原因是您在g.Select(i => i.tts.Number)中选择了一个值列表。 也许列表中只有一个值,但是C#仍然看到一个列表。 数组的ToString方法是从Object类继承的。因此它会打印类型名称。

答案 1 :(得分:0)

通过将“ Isin”和“代码”更改为此来解决此问题:

   Code = g.Select(i => i.ts.Number).Distinct().First(),
   Isin = g.Select(i => i.ts.Isin).Distinct().First(),