我有一个用户及其在不同地方签到的数据库,其中包含与外键相关的时间戳。用户可以随时登记,并且可以具有任意数量的条目。我需要一个LINQ-to-Entities查询,它将返回数据库中的签入,但只返回每个用户的最新签入。我不是SQL或LINQ分组的主人,我想我需要对条目进行分组。我见过LINQ group by and getting latest value。有一个答案(https://stackoverflow.com/a/2657436/811405)返回我想要获得的内容,但它返回一个匿名类。有没有办法以强类型的方式返回我的类的实例而不选择匿名类?
更新:
我已经上过这堂课:
public partial class LocationUpdate
{
public int ID { get; set; }
public System.DateTime DateUpdated { get; set; }
public System.Data.Entity.Spatial.DbGeography Position { get; set; }
public int UserID { get; set; }
public virtual User User { get; set; }
}
我有这个问题:
IQueryable<LocationUpdate> nearbyUserLocations = [some LINQ-to-Entities query];
我想,就在这一行下面,这样的查询:
nearbyUserLocations = [collection of each user's latest location update];
我仍然需要IQueryable<LocationUpdate>
类型,不某种匿名类型。
答案 0 :(得分:2)
是的 - 如果我从你的例子中正确地阅读你的问题 - 而不是做:
var maxObjects =
from o in myList
group o by o.Name into g
select new { Name = g.Key, Created = g.Max(o => o.Created) };
尝试做:
var maxObjects =
from o in myList
group o by o.Name into g
select new MyClass{ Name = g.Key, Created = g.Max(o => o.Created) };
如果你想要查询
maxObjects.AsQueryable<MyClass>();
假设MyClass具有公共属性Name and Created。
在进一步信息后进行修改
这是一个可测试的查询...
class Program
{
static void Main(string[] args)
{
List<LocationUpdate> locationUpdates =
new List<LocationUpdate>
{
new LocationUpdate {UserID = 1, Position = 2},
new LocationUpdate {UserID = 1, Position = 3},
new LocationUpdate {UserID = 2, Position = 1},
new LocationUpdate {UserID = 2, Position = 2},
new LocationUpdate {UserID = 1, Position = 4},
new LocationUpdate {UserID = 3, Position = 1}
};
IEnumerable<Tuple<int, List<MyClass>>> result = locationUpdates.GroupBy(x => x.UserID)
.Select(x => new Tuple<int, List<MyClass>>(x.Key,
x.Select(y => new MyClass {Position = y.Position, UserID = y.UserID}).ToList()));
foreach (Tuple<int, List<MyClass>> tuple in result)
{
Console.WriteLine("User {0}", tuple.Item1);
foreach (MyClass myClass in tuple.Item2)
Console.WriteLine("User {0}, Position {1}", myClass.UserID, myClass.Position);
}
Console.ReadLine();
}
public class MyClass
{
public int Position { get; set; }
public int UserID { get; set; }
}
public class LocationUpdate
{
public int Position { get; set; }
public int UserID { get; set; }
}
}
显然我已经离开了一些额外的属性,因为它们只是噪音,但你应该只能将它们添加到代码块中,这会创建一个新的MyClass ......
你仍然可以使结果可查询 - 结果包含的分组可能并不完全符合您的预期 - 我认为这种结果类型可能会满足您的需求,也许这就是为什么您无法获得合适的结果Linq查询为您提供数据。
它是否回答了你的问题,我希望这会有所帮助!