2014-02-10 39 views
1

我有一個用戶數據庫及其在具有時間戳的不同位置與外鍵相關的簽入。用戶可以隨時登記,並且可以有任意數量的條目。我需要一個LINQ-to-Entities查詢來返回數據庫中的簽入,但只返回每個用戶的最新簽入。我不是SQL或LINQ分組的主人,我想我需要對條目進行分組。我見過LINQ group by and getting latest value。有一個答案(https://stackoverflow.com/a/2657436/811405)返回我想要得到的,但它返回一個匿名類。有沒有辦法以強類型的方式返回我的類的實例,而不選擇匿名類?以強類型的方式獲取每個用戶在LINQ to Entities中的最新條目

UPDATE:

我已經有這個類:

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

用戶可以隨時登記入住,但他們是否可以離開? (對不起,忍不住。) – DeanOC

回答

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和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的代碼塊中...

您仍然可以使結果可查詢 - 結果包含的分組可能並不完全符合您的預期 - 我認爲t可能這個結果類型會適合你的需求,也許這就是爲什麼你無法獲得合適的Linq查詢來獲取數據的原因。

無論它是否回答你的問題,我希望這有助於!

+0

是的,這就是我想要的,但是我被卡住了,因爲我的MyClass中還有其他屬性,我也想包含它。我該如何做到這一點,例如'選擇新的MyClass {名稱= g.Key,創建= g.Max(o => o.Created),MyOtherProperty = ??? };' –

+0

我不知道我的理解 - 你可以使用他的對象初始值設定項(正如我在我的例子中所做的那樣)或添加一個構造函數來獲取這些額外的屬性......沒有看到你在實現'myList'或實際查詢本身時有什麼不可能說。分組返回的內容幾乎就是一個鍵/值對,其中值是來自列表中的IEnumerable對象。您可能需要稍微分解一下以獲取MyClass ...您可以發佈更多關於您正在獲取的數據以及您希望在MyClass中看到的內容的信息嗎? – Jay

+0

我已經將我的實際類添加到問題中。 –

相關問題