0

ユーザーからの静的データを (正しく) 提供するこの Linq クエリがあります。ここで、ユーザー テーブルの「インクルード」を手動で実行します。私が探しているのは、このクエリの結果が実際に親 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) に結果を入力したいと考えています。クエリの。

4

2 に答える 2

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

データベース内のデータではなく、必要なデータのみが入力されたStatisticsプロパティを使用して、Usersのクエリが必要です。

ユーザーの標準の「インクルードクエリ」を作成すると、すべての統計データが取得され、ローカルでフィルタリングできます。この場合、実際に必要な数よりも多くのデータがロードされる可能性があります。

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に勝ちます。

于 2012-05-18T14:16:56.223 に答える