Linq结果作为父(User)对象的集合

时间:2012-05-18 13:06:12

标签: c# linq entity-framework

我有这个Linq查询(正确)提供来自用户的满足静态数据。我现在手动执行User表的'Include'。我要找的是这个查询的结果实际上变成了父User对象的集合。

如果我选择多个用户名(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();

更新18-05-2012 15:41

简单地返回s2.User将无法工作,因为它将返回用户多次,因为从统计表返回的行,我只想获得1个用户对象并让它的统计信息集合(User.Statistics)填充查询结果。

2 个答案:

答案 0 :(得分:1)

在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();

答案 1 :(得分:0)

您需要查询“用户”,其中“统计”属性仅填充所需的数据,而不是数据库中的数据。

如果您编写标准&#34;包含查询&#34;对于用户,您将获得所有统计数据,然后您可以在本地过滤。在这种情况下,可能会加载的数据超出您的实际需求。

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。