0

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

如果我选择多个用户名(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)填充结果的查询。

4

2 回答 2

1

在您的选择子句中返回用户:

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();
于 2012-05-18T13:26:39.057 回答
0

您想要查询用户,统计属性仅填充您想要的数据,而不是数据库中的数据。

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

from u in db.Users.Include("Statistics")
where u.ScreenName == theScreenName
select u;

您还可以编写一个查询,只在结果类型中加载您想要的统计信息。在这种情况下,不会填充 User 实例的统计属性。

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。

于 2012-05-18T14:16:56.223 回答