[英]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.