Your query differs from query i provided here:
How to convert in linq this query[
^]
If my earlier solution returns wrong result set, try this:
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();
Tested on below example (via using
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);
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();
}
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)});
}