Maciej Los
Ваш запрос отличается от запроса, который я предоставил здесь: Как преобразовать этот запрос в LINQ[^]
Если мое предыдущее решение возвращает неверный результирующий набор, попробуйте сделать это:
var sender = (from item in ct.tblA
group item by item.Message into msgGroup
select msgGroup.Where(e=>e.Type == "Enter")
.OrderByDescending(e => e.CreatedDate)
.First())
.ToList();
Протестировано на приведенном ниже примере (с помощью использования
Помощью linqpad):
void Main()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[]
{
new DataColumn("Message", typeof(string)),
new DataColumn("Type", typeof(string)),
new DataColumn("CreatedDate", typeof(DateTime))
});
AddSampleData(ref dt);
//dt.Dump();
var latestMessages = dt.AsEnumerable()
.GroupBy(x=>x.Field<string>("Message"))
.Select(grp=>grp.Where(x=>x.Field<string>("Type")=="Enter")
.OrderByDescending(x=>x.Field<DateTime>("CreatedDate"))
.FirstOrDefault())
.ToList();
latestMessages.Dump();
}
// Define other methods and classes here
public void AddSampleData(ref DataTable dt)
{
dt.Rows.Add(new object[]{"Hello World!", "Enter", DateTime.Now.AddHours(-5).AddMinutes(-45)});
dt.Rows.Add(new object[]{"Hello World!", "Leave", DateTime.Now.AddHours(-5).AddMinutes(-47)});
dt.Rows.Add(new object[]{"Hello World!", "Enter", DateTime.Now.AddHours(-5).AddMinutes(-49)});
dt.Rows.Add(new object[]{"Hello Kitty!", "Enter", DateTime.Now.AddHours(-8).AddMinutes(-15)});
dt.Rows.Add(new object[]{"Hello Kitty!", "Leave", DateTime.Now.AddHours(-7).AddMinutes(-55)});
dt.Rows.Add(new object[]{"Hello Kitty!", "Exit", DateTime.Now.AddHours(-7).AddMinutes(-5)});
dt.Rows.Add(new object[]{"Oh, Caramba!", "Enter", DateTime.Now.AddHours(-6).AddMinutes(-15)});
dt.Rows.Add(new object[]{"Oh, Caramba!", "Leave", DateTime.Now.AddHours(-6).AddMinutes(-5)});
dt.Rows.Add(new object[]{"Oh, Caramba!", "Exit", DateTime.Now.AddHours(-5).AddMinutes(-59)});
dt.Rows.Add(new object[]{"Good evening!", "Enter", DateTime.Now.AddHours(-2)});
dt.Rows.Add(new object[]{"Good evening!", "Leave", DateTime.Now.AddHours(-1).AddMinutes(-48)});
dt.Rows.Add(new object[]{"Good evening!", "Enter", DateTime.Now.AddHours(-1).AddMinutes(-45)});
}