![](/img/trans.png)
[英]Lambda expression in C# using Entity Framework with multiple left outer joins with in line additional filter
[英]How to filter entity framework result with multiple columns using a lambda expression
我有下表:
以下數據:
如何過濾結果,以便我只從每個omraade_id
獲取最新的行(按timestamp
降序排序)?
在這種情況下,其中id為1010
和1005
的行
-
從@ lazyberezovsky的回答中,我創建了以下表達式:
dbConnection = new ElecEntities();
var query = from data in dbConnection.Valgdata
orderby data.timestamp descending
group data by data.omraade_id into g
select g.FirstOrDefault();
return query.ToList();
它返回ID為3和4的兩行,它們是數據庫中的前兩行,也是時間戳最低的行。 知道為什么嗎?
var query = dbConnection.Valgdata
.GroupBy(x => x.omraade_id)
.Select(g => g
.OrderByDescending(x => x.timestamp)
.FirstOrDefault());
我沒有EF的經驗,所以我不確定是否只有SQL-esque linq在這里工作。 簡單的C#-ish:
var query = dbConnection.Valgdata.GroupBy(u => u.omraade_id)
.Select(x => x.FirstOrDefault(y => x.Max(p => p.timestamp) == y.timestamp));
var query = from v in dbConnection.Valgdata
orderby v.timestamp descending
group v by v.omraade_id into g
select g.First();
這將僅返回每個omraade_id的最大時間戳記錄。
上面的UPDATE查詢對我來說很好(至少對於MS SQL Linq提供程序)。 你也不需要做FirstOrDefault
- 如果omraade_id被分組,那么它肯定至少有一行。
var query = from v in dbConnection.Valgdata
group v by v.omraade_id into g
select g.OrderByDesc(x => x.timestamp).First();
你已經對每個項目進行了過濾。 它應該應用於完整的查詢結果,而不是每個項目。
以下是更新的查詢。
var query = (from data in dbConnection.Valgdata
orderby data.timestamp descending
group data by data.omraade_id into g
select g).FirstOrDefault();
到目前為止這是我的解決方案:
var data = dbConnection.Valgdata.Where(x => x.godkendt == false).ToList();
var dataGrouped = data.GroupBy(x => x.omraade_id).ToList();
List<Valgdata> list = new List<Valgdata>();
foreach (var grpdata in dataGrouped)
{
var dataGroup = grpdata.OrderByDescending(x => x.timestamp).ToList();
list.Add(dataGroup.FirstOrDefault());
}
return list;
我不知道它是否最有效,但它確實有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.