stelazh Ответов: 1

Нужен этот запрос для преобразования в linq


как преобразовать этот запрос в LINQ :

select t.Message
from [dbo].[tblA] t
inner join (
select Message, max(CreatedDate) as MaxDate
from [dbo].[tblA]
group by Message
) tm on t.Message = tm.Message and t.CreatedDate = tm.MaxDate
where Type='Enter'


Что я уже пробовал:

мне нужно преобразовать этот sql запрос в linq

Что я уже пробовал:

я уже пробовал это сделать :

var sender = (from item in ct.tblA
              where item.Type == "Enter"
              group item by item.Message into msgGroup
              select msgGroup.OrderByDescending(t => t.CreatedDate).FirstOrDefault().Message).ToArray();


но этот запрос возвращает список всех пользователей, которые имеют в списке 1 раз type = enter ...мне нужен список пользователей, которые имеют последний тип статуса enter.

Пожалуйста, помогите мне .

Maciej Los

Пожалуйста, соблюдайте правила и не делайте репостов!
Как преобразовать этот запрос в LINQ[^]?
Если у вас есть какой-либо вопрос, вы должны оставить комментарий автору ответа.

1 Ответов

Рейтинг:
0

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)});
}