Linq中如何取出每个用户的符合条件的第一条记录?

百思软件工作室 2010-10-25 06:13:04
Linq中如何取出每个用户的符合条件的第一条记录?

数据库有以下几个字段:
主键 用户id 名次 时间 是否正常
1 100 10 20101012 1
2 100 20 20101009 1
3 200 11 20101011 1
4 100 18 20101008 1
5 300 2 20101010 1
6 300 15 20101013 1
7 300 16 20101002 0
我要得到这样的结果:
100 18 20101008
200 11 20101011
300 2 20101010
请问这个用Linq怎么实现??
...全文
1053 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
keke811 2011-08-26
  • 打赏
  • 举报
回复
sp1234
在灌水.
sanba1100 2010-10-30
  • 打赏
  • 举报
回复
linq是什么??
  • 打赏
  • 举报
回复
caoshuming_500 2010-10-30
  • 打赏
  • 举报
回复
学习了 先分组 后按时间排序
Cobra_520 2010-10-29
  • 打赏
  • 举报
回复
我也有点犯晕 来看看
  • 打赏
  • 举报
回复
var userobj = (
from a in dc.TradeKey
where a.Status == 0 && a.Level.Trim() == Level && a.StartTime.HasValue
group a by a.UserID into g
select new iTry86.UserLib.Model.TradeKey
{
UserID = g.Key,
SN = g.OrderByDescending(t => t.StartTime).Select(t => t.SN).First()
}
)
.ToArray();
用Linq搞定了,谢谢楼上的指导
如果这个用SQL
select top 1 userid,keyid from A group by userid
怎么不行啊?
flyerwing 2010-10-26
  • 打赏
  • 举报
回复
XXX类型 en=lst.First();
好象成吧.
PxxxP 2010-10-26
  • 打赏
  • 举报
回复
 public class User { public string UserId { get; set; } public string Rank { get; set; } public string Date { get; set; } public string IsNormal { get; set; } } 


       

static IEnumerable<User> GetData()
{
yield return new User { UserId = "100", Rank = "10", Date = "20101012", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "20", Date = "20101009", IsNormal = "1" };
yield return new User { UserId = "200", Rank = "11", Date = "20101011", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "18", Date = "20101008", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "2", Date = "20101010", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "15", Date = "20101013", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "16", Date = "20101002", IsNormal = "0" };
}

static void Main(string[] args)
{

var Query = from user in GetData()
where user.IsNormal=="1"
group user by user.UserId into g
select new {
UserId = g.Key,
Rank = (GetData().Where(d => d.Date == g.Min(u => u.Date)).Select(d=>d.Rank)).First(),
Date = g.Min(u => u.Date) };
foreach (var v in Query)
{
Console.WriteLine("UserID={0} Rank={1} Date={2}",v.UserId,v.Rank,v.Date);
}

/*
UserID=100 Rank=18 Date=20101008
UserID=200 Rank=11 Date=20101011
UserID=300 Rank=2 Date=20101010
*/
光脚丫思考 2010-10-26
  • 打赏
  • 举报
回复
使用Where()和First()运算符的组合运算,在Where()运算符中指定查询条件。第二种做法就是只使用First()运算符,将查询条件作为参数传递给此方法。有疑问,继续留言!
机器人 2010-10-25
  • 打赏
  • 举报
回复
还少个User的类定义。

public class User
{
public string UserId { get; set; }
public string Rank { get; set; }
public string Date { get; set; }
public string IsNormal { get; set; }
}



机器人 2010-10-25
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
var list = GetData();

var query =
from u in list
where u.IsNormal == "1"
group u by u.UserId into g
orderby g.Key
from u2 in g
where u2.Date == g.Min(u3 => u3.Date)
select u2;

foreach (var u in query)
Console.WriteLine("{0}, {1}, {2}", u.UserId, u.Date, u.Rank);


Console.Read();
}

static IEnumerable<User> GetData()
{
yield return new User { UserId = "100", Rank = "10", Date = "20101012", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "20", Date = "20101009", IsNormal = "1" };
yield return new User { UserId = "200", Rank = "11", Date = "20101011", IsNormal = "1" };
yield return new User { UserId = "100", Rank = "18", Date = "20101008", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "2", Date = "20101010", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "15", Date = "20101013", IsNormal = "1" };
yield return new User { UserId = "300", Rank = "16", Date = "20101002", IsNormal = "0" };
}

symbol_bc 2010-10-25
  • 打赏
  • 举报
回复
什么条件啊??
wuyq11 2010-10-25
  • 打赏
  • 举报
回复
根据时间排序
db.Tb
.OrderByDescending(x=> x.时间)
.group ...
.FirstOrDefault();
1.简单形式: var q = ( from c in db.Customers select c.Phone ).Concat( from c in db.Customers select c.Fax ).Concat( from e in db.Employees select e.HomePhone ); 语句描述:返回所有消费者和雇员的电话和传真。 2.复合形式: var q = ( from c in db.Customers select new { Name = c.CompanyName, c.Phone } ).Concat( from e in db.Employees select new { Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone } ); 语句描述:返回所有消费者和雇员的姓名和电话。 Union(合并) 说明:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项。 var q = ( from c in db.Customers select c.Country ).Union( from e in db.Employees select e.Country ); 语句描述:查询顾客和职员所在的国家。 Intersect(相交) 说明:取相交项;延迟。即是获取不同集合的相同项(交集)。即先遍历第一个集合,找出所有唯一的元素,然后遍历第二个集合,并将每个元素与前面找出的元素作对比,返回所有在两个集合内都出现的元素。 var q = ( from c in db.Customers select c.Country ).Intersect( from e in db.Employees select e.Country ); 语句描述:查询顾客和职员同在的国家。 Except(与非) 说明:排除相交项;延迟。即是从某集合删除与另一个集合相同的项。先遍历第一个集合,找出所有唯一的元素,然后再遍历第二个集合,返回第二个集合所有未出现在前面所得元素集合的元素。 var q = ( from c in db.Customers select c.Country ).Except( from e in db.Employees select e.Country ); 语句描述:查询顾客和职员不同的国家。 Top/Bottom操作 适用场景:适量的取出自己想要的数据,不是全部取出,这样性能有所加强。 Take 说明:获取集合的前n个元素;延迟。即只返回限定数量的结果集。 var q = ( from e in db.Employees orderby e.HireDate select e) .Take(5); 语句描述:选择所雇用的前5个雇员。 Skip 说明:跳过集合的前n个元素;延迟。即我们跳过给定的数目返回后面的结果集。 var q = ( from p in db.Products orderby p.UnitPrice descending select p) .Skip(10); 语句描述:选择10种最贵产品之外的所有产品。 TakeWhile 说明:直到某一条件成立就停止获取;延迟。即用其条件去依次判断源序列的元素,返回符合判断条件的元素,该判断操作将在返回false或源序列的末尾结束 。 SkipWhile 说明:直到某一条件成立就停止跳过;延迟。即用其条件去判断源序列的元素并且跳过第一个符合判断条件的元素,一旦判断返回false,接下来将不再进行判断并返回剩下的所有元素。 Paging(分页)操作 适用场景:结合Skip和Take就可实现对数据分页操作。 1.索引 var q = ( from c in db.Customers orderby c.ContactName select c) .Skip(50) .Take(10); 语句描述:使用Skip和Take运算符进行分页,跳过前50条记录,然后返回接下来10条记录,因此提供显示Products表第6页的数据。 2.按唯一键排序 var q = ( from p in db.Products where p.ProductID > 50 orderby p.ProductID select p) .Take(10); 语句描述:使用Where子句和Take运算符进行分页,首先筛选得到仅50 (第5页最后一个ProductID)以上的ProductID,然后按ProductID排序,最后取前10个结果,因此提供Products表第6页的数据。请注意,此方法仅适用于按唯一键排序的情况。 SqlMethods操作 在LINQ to SQL语句,为我们提供了SqlMethods操作,进一步为我们提供了方便,例如Like方法用于自定义通配表达式,Equals用于相比较是否相等。 Like 自定义的通配表达式。%表示零长度或任意长度的字符串;_表示一个字符;[]表示在某范围区间的一个字符;[^]表示不在某范围区间的一个字符。比如查询消费者ID以“C”开头的消费者。 var q = from c in db.Customers where SqlMethods.Like(c.CustomerID, "C%") select c; 比如查询消费者ID没有“AXOXT”形式的消费者: var q = from c in db.Customers where !SqlMethods.Like(c.CustomerID, "A_O_T") select c; DateDiffDay 说明:在两个变量之间比较。分别有:DateDiffDay、DateDiffHour、DateDiffMillisecond、DateDiffMinute、DateDiffMonth、DateDiffSecond、DateDiffYear var q = from o in db.Orders where SqlMethods .DateDiffDay(o.OrderDate, o.ShippedDate) < 10 select o; 语句描述:查询在创建订单后的 10 天内已发货的所有订单。 已编译查询操作(Compiled Query) 说明:在之前我们没有好的方法对写出的SQL语句进行编辑重新查询,现在我们可以这样做,看下面一个例子: //1.创建compiled query NorthwindDataContext db = new NorthwindDataContext(); var fn = CompiledQuery.Compile( (NorthwindDataContext db2, string city) => from c in db2.Customers where c.City == city select c); //2.查询城市为London的消费者,用LonCusts集合表示,这时可以用数据控件绑定 var LonCusts = fn(db, "London"); //3.查询城市为Seattle的消费者 var SeaCusts = fn(db, "Seattle"); 语句描述:这个例子创建一个已编译查询,然后使用它检索输入城市的客户。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧