以强类型方式获取LINQ to Entities中每个用户的最新条目

时间:2014-02-10 21:20:58

标签: c# linq linq-to-entities

我有一个用户及其在不同地方签到的数据库,其中包含与外键相关的时间戳。用户可以随时登记,并且可以具有任意数量的条目。我需要一个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>类型,某种匿名类型。

1 个答案:

答案 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查询为您提供数据。

它是否回答了你的问题,我希望这会有所帮助!