簡體   English   中英

Linq to SQL數據完整性分組

[英]Linq to SQL data integrity with grouping

前段時間我問了一個問題SQL Server:如何使用帶有group by的聚合函數來維護數據完整性? 我在那里得到了一個很好的答案,但是現在問題又出現了,這次是Linq to SQL,而不是普通的SQL。

背景故事:我有一個充滿gps數據的表,看起來像這樣:

GPS_id,user_id,緯度,經度,server_time,device_time

我使用以下linq查詢為特定用戶組提取了最新的gps記錄:

var query =
    from gps in db.gps_data
    where (from u in db.users
        select u.user_id).Contains(gps.user_id)
    group gps by gps.user_id into groupedGPS
    select groupedGPS;

然后,我像這樣循環遍歷它,但是我必須先訂購它才能正確獲取“最新記錄”。

foreach (var gpsItem in query) {
    var ordered = gpsItem.OrderByDescending(g => g.device_time);
    list.Add(ordered.First());
}

這滿足了我的需求,但是在任何時候,我都有100多個用戶,每個用戶都有500多個gps記錄(並且所有此類都以這種方式訪問​​),因此這段代碼花了10多個秒,我認為這是不可接受的。

然后我將其更改為以下內容

var query =
    from gps in db.gps_data
    where (from u in db.users
        select u.user_id).Contains(gps.user_id)
    group gps by gps.user_id into groupedGPS
    select new 
    {
        GPS_id = groupedGPS.Max(x => x.GPS_id),
        user_id = groupedGPS.Max(x => x.user_id),
        latitude = groupedGPS.Max(x => x.latitude),
        longitude = groupedGPS.Max(x => x.longitude),
        server_time = groupedGPS.Max(x => x.server_time),
        device_time = groupedGPS.Max(x => x.device_time) 
    };

該查詢的速度似乎更快,因為據我所知,所有不必要的數據從未真正加載到內存中。 但是,就像幾個月前的原始問題一樣,我已經失去了數據完整性。 不能保證我看到的是最近的記錄 ,只是分組中所有字段的最大值。 這對大多數字段沒有影響,但是緯度和經度幾乎總是不正確的,因為它們只是分組中找到的max()記錄,而不是最近的記錄。

我如何解決這個問題? 我意識到我有第一個解決方案來檢索我正確的數據,但是花費的時間太長了。

謝謝您的幫助!

據我了解您的問題(每個用戶ID的最新記錄),它似乎可以滿足您的需求;

var q =
    from gps in db.gps_data
    where (from gps2 in db.gps_data
           group gps2 by gps2.user_id
           into g
           select new {a = g.Key, b = g.Max(f => f.server_time)})
           .Contains(new {a = gps.user_id, b = gps.server_time})
    select gps;

如果一個用戶同時有多個讀數,則可能會給您帶來重復,我假設它們不是。

以下應該可以工作,但是會執行多個子選擇,因此您需要檢查性能並確保內聯FirstOrDefault與LINQ提供程序一起使用:

var query =
    from u in db.users
    select new
    {
        u.user_id,
        latestGPS = (db.gps_data
                    where g.user_id == u.user_id
                    orderby g.server_time descending
                    select g).FirstOrDefault()
    };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM