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