簡體   English   中英

Linq結果作為父(用戶)對象的集合

[英]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();

更新18-05-2012 15:41

簡單地返回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.

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