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

本文关键字:对象 集合 用户 结果 Linq | 更新日期: 2023-09-27 18:34:31

我有一个 Linq 查询,它(正确(提供来自用户的静态数据。我现在手动执行用户表的"包含"。我要查找的是,此查询的结果实际上成为父 User 对象的集合。

如果我选择多个用户名 (s.User.Name( 而不是我现在使用的单个用户名,我只会返回与我搜索的用户名相同数量的 User 对象,他们的统计信息 (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。用户不会工作,因为它会返回用户的次数与统计表返回的行一样多,我只想获得 1 个用户对象并用查询结果填充它的统计信息集合 (User.Statistics(。

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

返回 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();

您需要对 Users 进行查询,其中 Statistics 属性仅填充所需的数据,而不是数据库中的数据。

如果编写用户的标准"包含查询",则将获取所有统计信息数据,然后可以在本地筛选这些数据。 在这种情况下,加载的数据可能比您实际想要的要多。

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

您还可以编写一个查询,仅加载结果类型中所需的统计信息。 在这种情况下,将不会填充用户实例的统计信息属性。

from u in db.Users
where u.ScreenName == theScreenName
let stats = u.Statistics.Where(...)
select new {User = u, Stats = stats.ToList()};

无法在 LinqToEntities 中获取所需的内容(部分填充的用户统计信息(。 在 LinqToSql 中,我们将使用 DataLoadOptions.AssociateWith 来完成这项工作。

LinqToSql 再次战胜了 EF。