[英]Linq result as collection of parent (User) object
我有這個Linq查詢,(正確地)提供了來自用戶的靜態數據。 現在,我手動執行“用戶”表的“包含”。 我要查找的是此查詢的結果實際上成為父User對象的集合。
如果我選擇多個用戶名(s.User.Name)而不是現在使用的單個用戶名,那么我將只返回與搜索帶有填充有數據的統計信息(User.Statistics)的用戶名相同數量的User對象就像下面的查詢返回的一樣。
var statistics = ((
from s in db.Statistics
where s.User.ScreenName == screenName &&
s.CreateDate > EntityFunctions.AddDays(DateTime.Now, days)
group s by EntityFunctions.TruncateTime(s.CreateDate) into dg
let maxDate = dg.Max(x => x.CreateDate)
from s2 in db.Statistics
where s2.User.ScreenName == screenName &&
s2.CreateDate == maxDate
orderby s2.CreateDate
select s2) as ObjectQuery<Statistic>).Include("User").ToList();
簡單地返回s2.User將不起作用,因為它將返回用戶的次數與統計表返回的行的次數相同,我只想獲取1個用戶對象,並用結果填充其統計信息集合(User.Statistics)查詢。
在您的select子句中返回用戶:
var users=
(
from s in db.Statistics
where s.User.ScreenName == screenName &&
s.CreateDate > EntityFunctions.AddDays(DateTime.Now, days)
group s by EntityFunctions.TruncateTime(s.CreateDate) into dg
let maxDate = dg.Max(x => x.CreateDate)
from s2 in db.Statistics
where s2.User.ScreenName == screenName &&
s2.CreateDate == maxDate
orderby s2.CreateDate
select s2.User.User // <--------
).ToList();
要獲得唯一的用戶列表,請添加.Distinct()
。 如果這不起作用,這里是一個猜測(不知道您的對象模型)如何獲取用戶:
var allusernames=
(
from s in db.Statistics
where s.User.ScreenName == screenName &&
s.CreateDate > EntityFunctions.AddDays(DateTime.Now, days)
group s by EntityFunctions.TruncateTime(s.CreateDate) into dg
let maxDate = dg.Max(x => x.CreateDate)
from s2 in db.Statistics
where s2.User.ScreenName == screenName &&
s2.CreateDate == maxDate
orderby s2.CreateDate
select s2.User.UserName // <--------
).ToList();
var distinct users =
(
from u in users
where allusernames.Contains(u.UserName)
select u
).ToList();
您要查詢“用戶”,“統計信息”屬性僅填充所需的數據,而不填充數據庫中的數據。
如果編寫標准的用戶“包含查詢”,您將獲得所有統計數據,然后可以在本地進行過濾。 在這種情況下,可能會加載比實際所需更多的數據。
from u in db.Users.Include("Statistics")
where u.ScreenName == theScreenName
select u;
您還可以編寫一個查詢,該查詢僅在結果類型中加載所需的統計信息。 在這種情況下,將不會填充User實例的statistics屬性。
from u in db.Users
where u.ScreenName == theScreenName
let stats = u.Statistics.Where(...)
select new {User = u, Stats = stats.ToList()};
在LinqToEntities(部分填充了User.Statistics)中無法獲得您的要求。 在LinqToSql中-我們將使用DataLoadOptions.AssociateWith
來完成這項工作。
LinqToSql再次戰勝了EF。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.