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(。
返回 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。