试图将基本的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
答案 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(),