![](/img/trans.png)
[英]How to Read Record From Database in ASP.MVC Core using Entity Framework Core 1.0
[英]Max and min record from database using Entity Framework Core
我有一個簡單的方法,可以根據一些參數從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的集合(實際上是一個任務,但最終結果是一個集合)。 可以對此進行修改,以便我只能從數據庫中獲得兩個值最低的日期,第二個具有最高的日期嗎?
我嘗試了最大和最小,但僅在查詢實現后才出現,最終得到的是最大和最小值或屬性,而不是整個記錄。
此問題可以通過刪除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();
}
}
我假設您有相同ID的記錄。 剛剛創建了一個linqpad示例(我不確定您是否要列出最小值,最大值行或僅列出min和max),方法是將同一字段分組(適當地在ID上)並選擇min,max
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() { }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.