1

こんにちは、ユーザーが画像に投票できるサイトがあります。投票はテーブル Votes に保存され、提出の ID (FK_id) が保存されます。


テーブルは次のとおりです。

テーブル提出
Id (uniqueidentifier)
名前 (varchar(50))
画像 (varchar(50))

Table Votes
Id (int)
Fk_id (Submissions.Id への外部キー)

私はlinqが初めてなので、これを翻訳する方法がわかりません:

SELECT *, 
    isnull((SELECT count(*) 
    FROM Votes
    WHERE Fk_id = S.Id      
    GROUP BY Fk_id),0) as Votes 
FROM Submissions S

私はこのようなものが欲しかった:

List<Model> = (from p in ????
               select new Model
               {
                   Name = p.Name,
                   Image = p.Image,
                   Votes = p.Votes               
               }).ToList();

ありがとうございました。

4

3 に答える 3

3

SQLを翻訳するのではなく(私は非常に複雑だと思います)、次のようなことをしたいだけではありません:

List<Model> = (from p in Submissions 
              select new Model
              {
                 Name = p.Name,
                 Image = p.Image,
                 Votes = p.Votes.Count() 
              }).ToList();
于 2012-10-26T18:41:56.077 に答える
1

順序が逆になっていることを除けば、私にはかなりまっすぐなポートのように思えselectますfrom

Submissions.Select(sub => new
{
  //...other fields
  Votes = Votes.Where(vote => vote.Fk_id == sub.Id)
               .GroupBy(vote => vote.Fk_id)
               .Select(group => group.Count()),
}

さて、クエリを見ると、内部クエリとしてではなく、Votesで直接グループ化することができます。これはかなり効率的ですが、それは完全にあなた次第です。

于 2012-10-26T18:15:41.570 に答える
1

これはコードの翻訳になります。これには、送信ごとにモデルがあることもSQL考慮されます。isnull

List<Model> list = (from s in Submissions
        select new Model
        {
            Id = s.Id,
            Name = s.Name,
            Image = s.Image,
            Votes = (from v in Votes
                     where v.Fk_id == s.Id
                     group v by v.Fk_id into g
                     select g.Count()).FirstOrDefault()
        }).ToList();

を使用している場合はEntity Framework、データ モデルが正しく生成されていることを確認する必要があります。この場合、SubmissionエンティティにはすでにVotesプロパティとして含まれています。次に、すべてが次のように簡単です。

List<Model> list = (from s in context.Submissions
                    select new Model
                    {
                        Id = s.Id,
                        Name = s.Name,
                        Image = s.Image,
                        Votes = s.Votes.Count()
                    }).ToList();
于 2012-10-26T18:36:22.643 に答える