我有一个简单的方法,根据一些参数从db返回一系列数据,而且很简单:
public async Task<IEnumerable<P2PStats>> GetFilteredNetStats(ushort id, ushort remoteId, DateTime start, DateTime end)
{
using (var ctx = new DataContext())
{
IQueryable<P2PStats> query = ctx.P2PStats
.Where(stat => stat.Id == id && stat.Date >= start && stat.Date <= end)
.Where(stat => stat.P2PStatsDetailed.Any(detail => detail.RemoteId == remoteId))
.Select(stat => new P2PStats
{
Id = stat.Id,
AxmCardId = stat.Id,
Date = stat.Date,
P2PStatsDetailed = stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
});
return await query.ToListAsync();
}
}它返回P2PStats的集合(实际上是一个任务,但最终结果是一个集合)。可以修改这一点,使我只能从数据库中获得2个值,首先是最低日期,其次是最高日期?
我尝试了Max和Min,但只是在查询被物化之后,我最终得到了max和min值或属性,而不是整个记录。
发布于 2019-07-11 00:27:30
这个问题可以通过删除按Id过滤并在代码中添加.Max()和.Min()方法来解决。
下面是一个示例,说明这是什么样子:
public async Task<IEnumerable<P2PStats>> GetNetStatsLowestAndHighestDate(ushort id, ushort remoteId, DateTime start, DateTime end)
{
using (var ctx = new DataContext())
{
IQueryable<P2PStats> query = ctx.P2PStats
.Where(stat => stat.Date >= start && stat.Date <= end)
.Where(stat => stat.P2PStatsDetailed.Any(detail => detail.RemoteId == remoteId))
.DefaultIfEmpty(0)
.Max(s => s.Date)
.Select(stat => new P2PStats
{
Id = stat.Id,
AxmCardId = stat.Id,
Date = stat.Date,
P2PStatsDetailed = stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
});
IQueryable<P2PStats> query2 = ctx.P2PStats
.Where(stat => stat.Date >= start && stat.Date <= end)
.Where(stat => stat.P2PStatsDetailed.Any(detail =>
detail.RemoteId ==
remoteId))
.DefaultIfEmpty(0)
.Min(s => s.Date)
.Select(stat => new P2PStats
{
Id = stat.Id,
AxmCardId = stat.Id,
Date = stat.Date,
P2PStatsDetailed =
stat.P2PStatsDetailed.Where(detail => detail.RemoteId == remoteId).ToList()
});
var results = query1.Concat(query2);
return await results.ToListAsync();
}
}发布于 2019-07-11 01:58:18
我假设你有相同ID的记录。刚刚创建了一个linqpad示例(我不确定你是想要最小值,最大值行的列表,还是只想要最小值和最大值)方法是在相同的字段上分组(可能是在ID上),然后选择最小,最大
void Main()
{
test t = new test();
var l = new List<test>() {
new test() {ID = 0, a1="aaa", a2 = 10},
new test() {ID = 1, a1="aaa", a2 = 40},
new test() {ID = 2, a1="aaa", a2 = 70},
new test() {ID = 3, a1="aaa", a2 = 50},
};
l.Dump("original");
l.GroupBy(g => g.a1).Select(s => new { max = s.Max(mm => mm.a2), min = s.Min(mi => mi.a2) }).Dump("return 2 values");
List<test> lRes = new List<test>();
lRes.Add(l.OrderBy(o => o.a2).First());
lRes.Add(l.OrderBy(o => o.a2).Last());
lRes.Dump("return table of min record and max record");
}
public class test
{
public int ID { get; set; }
public string a1 { get; set; }
public int a2 { get; set; }
public test() { }
}https://stackoverflow.com/questions/56973675
复制相似问题