C# Linq结果作为父(用户)对象的集合

C# Linq结果作为父(用户)对象的集合,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一个Linq查询,它(正确地)提供了来自用户的met静态数据。我现在手动执行用户表的“Include”。我要寻找的是,这个查询的结果实际上成为父用户对象的集合 如果我选择多个用户名(s.user.Name),而不是我现在使用的单个用户名,那么我只会返回与我搜索的用户名相同数量的用户对象,这些用户对象的统计信息(user.Statistics)集合中填充了下面查询返回的数据 var statistics = (( from s in db.Statistics

我有一个Linq查询,它(正确地)提供了来自用户的met静态数据。我现在手动执行用户表的“Include”。我要寻找的是,这个查询的结果实际上成为父用户对象的集合

如果我选择多个用户名(s.user.Name),而不是我现在使用的单个用户名,那么我只会返回与我搜索的用户名相同数量的用户对象,这些用户对象的统计信息(user.Statistics)集合中填充了下面查询返回的数据

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();
var统计=((
从s开始,以db.Statistics为单位
其中s.User.ScreenName==ScreenName&&
s、 CreateDate>EntityFunctions.AddDays(DateTime.Now,天)
按EntityFunctions.TruncateTime(s.CreateDate)将s分组到dg中
设maxDate=dg.Max(x=>x.CreateDate)
从s2开始,以db.统计数据为单位
其中s2.User.ScreenName==ScreenName&&
s2.CreateDate==maxDate
orderby s2.CreateDate
选择s2)作为ObjectQuery)。包括(“用户”).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();

您需要一个用户查询,Statistics属性只填充您想要的数据,而不是数据库中的数据

如果您编写一个标准的用户“包含查询”,您将获得所有统计数据,然后可以在本地进行筛选。在这种情况下,可能会加载比实际需要更多的数据

from u in db.Users.Include("Statistics")
where u.ScreenName == theScreenName
select u;
您还可以编写一个查询,只加载结果类型中所需的统计信息。在这种情况下,将不会填充用户实例的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中,我们将使用它来完成这项工作


LinqToSql再一次战胜了EF。

这不能简单地作为同一用户为每个对应的统计条目返回的x数。我想得到1个用户(因为我在这里只查询1个用户)和用户的统计集合(user.Statistics)以及查询结果;t提供一个只返回一个用户的查询。有关一些猜测,请参阅更新的答案。
from u in db.Users
where u.ScreenName == theScreenName
let stats = u.Statistics.Where(...)
select new {User = u, Stats = stats.ToList()};