请帮我按日期排序前10名不同行 [英] Please Help me to take Top 10 Distinct Rows order by Date
问题描述
我有一个Datatable有这样的记录...
Hi,
I have a Datatable having records like this...
JID Date RecentChatString
-----------------------------------------------------------------------
abc@gmail.com 11/Nov/2013 11:53:00 Hi
abc@gmail.com 11/Nov/2013 11:53:10 Hello
abc@gmail.com 11/Nov/2013 11:54:00 Good Morning
def@gmail.com 11/Nov/2013 12:03:00 Ok
abc@gmail.com 11/Nov/2013 12:05:10 Please reply
def@gmail.com 11/Nov/2013 12:15:00 Good after noon
def@gmail.com 11/Nov/2013 12:15:50 Ok bye
我希望获得按日期排序的前10个不同记录,并且仅表示每个JID的最近聊天..
I want to get Top 10 Distinct Records sorted by Date and, Means only the recent chat of each JID..
JID Date RecentChatString
-----------------------------------------------------------------------
abc@gmail.com 11/Nov/2013 12:05:10 Please reply
def@gmail.com 11/Nov/2013 12:15:50 Ok bye
现在我有一个这样的代码...我可以得到顶级使用此代码按日期排序的10条记录...
但是,它包含重复的JID ....请帮助我....(recent_index是一个DataTable)
Now I have a code like this... I can get the top 10 records sorted by date using this code...
But, It contains duplicate JID's.... Please help me .... (recent_index is a DataTable)
DataRow recent_dr = recent_index.NewRow();
recent_dr["JID"] = RosterId;
recent_dr["Date"] = DateTime.Now;
recent_dr["RecentChatString"] = _chatline;
recent_index.Rows.Add(recent_dr);
DataTable dtt = new DataTable("RecentChats");
dtt.Columns.Add("JID", Type.GetType("System.String"));
dtt.Columns.Add("Date", Type.GetType("System.DateTime"));
dtt.Columns.Add("RecentChatString", Type.GetType("System.String"));
IEnumerable<DataRow> recentTen = recent_index.AsEnumerable().OrderByDescending(x=>x["Date"]).Take(10);
recentTen.CopyToDataTable(dtt, LoadOption.OverwriteChanges);
dtt.WriteXml(s + "\\FPhoneData\\chats\\index.xml");
推荐答案
最后包括Distinct()
并检查。
IncludeDistinct()
at the end and check.
IEnumerable<datarow> recentTen = GetTable().AsEnumerable().OrderByDescending(x => x["Date"]).Take(10).Distinct();
以下是您查询的解决方案
这里我正在创建一个DataTable
Here is the solution for your query
here i am creating a DataTable
DataTable dt = new DataTable("mytable");
DataColumn dc1 = new DataColumn("ID", typeof(int));
dc1.AutoIncrement = true;
dc1.AutoIncrementSeed = 1;
dc1.AutoIncrementStep = 1;
dt.Columns.Add(dc1);
dt.Columns.Add(new DataColumn("name", typeof(string)));
dt.Columns.Add(new DataColumn("age", typeof(string)));
dt.Columns.Add(new DataColumn("date", typeof(DateTime)));
for (int i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
dr["name"] = "dasda " + i.ToString();
dr["age"] = (i * i).ToString();
switch (i)
{
case 0: dr["date"] = DateTime.Now.AddDays(i);
break;
case 1: dr["date"] = DateTime.Now.AddDays(2);
break;
case 2: dr["date"] = DateTime.Now.AddDays(i * i);
break;
case 3: dr["date"] = DateTime.Now.AddDays(i * i);
break;
case 4: dr["date"] = DateTime.Now.AddDays(2);
break;
case 5: dr["date"] = DateTime.Now.AddDays(i * i);
break;
case 6: dr["date"] = DateTime.Now.AddDays(2);
break;
case 7: dr["date"] = DateTime.Now.AddDays(i * i);
break;
case 8: dr["date"] = DateTime.Now.AddDays(i * i);
break;
case 9: dr["date"] = DateTime.Now.AddDays(2);
break;
default:
break;
}
dt.Rows.Add(dr);
}
现在我正在触发LINQ查询以获取您想要的记录..
now i am firing the LINQ query to fetch the records as you want..
var xyz = (from m in dt.Select()
let _name = m.Field<string>("name")
let _date = m.Field<DateTime>("date")
let _age = m.Field<string>("age")
let _id = m.Field<int>("id")
orderby _date descending
group m by _date into g
select new
{
_name = g.First()["name"].ToString(),
_id = Convert.ToInt32(g.First()["ID"]),
_age = g.First()["age"].ToString(),
_date = (DateTime)g.First()["date"]
}).ToList();
此查询将代表date.for获取最后十条记录的不同记录,我通过降序获得订单。 />
你想要前十名的记录然后只需调用TAKE()就可以获得结果。
this query will give the distinct record on the behalf of date.for fetching last ten record i used order by descending.
you want top 10 record then simply call TAKE() you wiil get the result.
var res= xyz.Take(10);
你将获得前10名记录。
you will get the top 10 records.
这篇关于请帮我按日期排序前10名不同行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!