1

C# と .NET Framework 4.0 を使用して Entity Framework Code First ライブラリを開発しています。

データベースに次のテーブルがあります。

ここに画像の説明を入力

SentBy列は User テーブルのSentToFK です。

別のユーザーにメッセージを送信したユーザーを取得したいのですが、一度だけ取得したいです。これを行うには、次の SQL ステートメントを使用します。

select distinct SentBy, DateUtcSent
  from Messages where isAFriendshipRequest = 0 and SentTo = 15
order by DateUtcSent DESC;

order by DateUtcSent DESC;最新のメッセージが最初に送信されるようにします。

アイデアは、ユーザー 15 にメッセージを送信した各ユーザーの行を取得することです。

しかし、私はこれを取得します:

ここに画像の説明を入力

ご覧のとおり、ユーザー 2 を 2 回取得しています。

最後の行は必要ありません。

ここでは、ユーザー 15 にメッセージを送信した各ユーザーを取得し、ユーザー ID、dateUtcSent、および結果の本文を取得しようとしています。

sentBy 値を複数回取得しないようにするにはどうすればよいですか?

アップデート

そして、私がこれをしたい場合:

select distinct SentTo, DateUtcSent
  from Messages where isAFriendshipRequest = 0 and SentBy = 15
order by DateUtcSent DESC;

次に、ユーザーを繰り返したり、最後のメッセージを取得したりせずに、両方の結果をマージします。

どうすればいいですか?

4

3 に答える 3

1

私たちの協力の後、最終的なクエリは次のとおりです。

var query =
    context.Messages
    .Where(x => x.IsAFriendshipRequest == false && x.SentTo == userId).Include("SentByUser")
    .Select(x => new { User = x.SentBy, x.DateUtcSent, x.Body, Name = x.SentByUser.Name })
    .Union
    (
        context.Messages
        .Where(x => x.IsAFriendshipRequest == false && x.SentBy == userId).Include("SentToUser")
        .Select(x => new { User = x.SentTo, x.DateUtcSent, x.Body, Name = x.SentToUser.Name })
    )
    .GroupBy(x => new {x.User, x.Name})
    .Select(x => new { User = x.Key.User, DateUtcSent = x.Max(z => z.DateUtcSent), Body = x.Where(z => z.DateUtcSent == x.Max(d => d.DateUtcSent)).Select(z=>z.Body ).SingleOrDefault(), Name = x.Key.Name});
于 2013-10-29T09:30:55.647 に答える
0

Your query is SQL, but I understand that you need a Linq To Sql query, so here it is:

var q = from message in Messages 
        where message.isAFriendshipRequest = 0 
        && message.SentTo = 15
        group message by message.SentBy into grp
        select grp.OrderByDescending(m => m.DateUtcSent).First();

You group by sender, order by date, and take only the first.

于 2013-10-29T09:32:42.210 に答える