0

LINQクエリに関するドキュメントとチュートリアルを読んでいますが、正しく理解できないようです。私はこれに似たモデルを持っており、それを永続化するためにエンティティフレームワークを使用しています:

public class Question
{
  public int Id {set;get;}
  public string Question {set;get;}
  public DateTime DateCreated {get;set;}
  public List<Answer> Answers {set; get;}
}

public class Answer
{
  public int Id {set; get;}
  public string UserAnswer {get;set;}
  public DateTime DateAnswered {get;set;}
  public User TheUserWhoAnswerd {get;set;}
}

public class User
{
  public int Id { get;set;}
  public string UserName {get;set;}
  public DateTime DateCreated {get;set;}
  public List<Question> Questions { get;set;}
}


The data context has something like this
public HashSet<Question> AllOfTheQuestionsDb {get;set;}
public HashSet<Answer> AllOfTheAnswersDb {get;set;}
public HashSet<User> AllOfTheUsersDb {get;set;}

私のフローはスタックオーバーフロー-トリビアスタイルに似ています。

システムはユーザーに質問を割り当てることができます(質問はシステム、つまり管理者によって生成され、最初は誰にも属していません)。その後、同じ質問を複数の異なるユーザーに割り当てることができます。その後、各ユーザーは質問に答えることができます。

質問には、それに与えられた回答のリストが含まれています。

したがって、たとえば、質問1がユーザー1から10に割り当てられていても、ユーザー2と4のみが回答した場合、その質問の「回答リスト」には2つの回答しかありません。

私の目標は、データソースでいくつかの基本的な並べ替えと選択を実行できるようにすることです。

例えば:

  1. 特定のユーザー(UserA)について、UserAがその質問に回答しなかったすべての質問を返します。

  2. システム内のすべての質問について、質問が割り当てられたが、そのユーザーが回答した/回答しなかったすべてのユーザーを返します

  3. 特定の日付以降に回答された/回答されなかったユーザーの質問と回答を選択する

4

2 に答える 2

0

私はそれらをテストしていませんが、あなたが望むものを与えるはずだと思います。

int UserA = 1;
// For a given user - UserA -, return all questions where UserA did not answer that question
// Look for questions where the count of UserA appearances is zero.
List<Question> NotAnsweredByUserA = AllOfTheQuestionsDb.Where(a => a.Answers.Count(b => b.TheUserWhoAnswerd.Id == UserA) == 0).ToList();

// For all questions in system, return all users that the question was assigned to but that user did/didn't answer
// Look for answers in questions where a User has been assigned, but no answer, and select that user
List<User> NotAnsweredButAssigned = AllOfTheQuestionsDb.SelectMany(a => a.Answers.Where(b => b.TheUserWhoAnswerd != null && string.IsNullOrWhiteSpace(b.UserAnswer)).Select(c => c.TheUserWhoAnswerd)).ToList();

// Selecting questions and answers for a user that were not answered after a given date
// Select the questions where the answer contains an answer date before today and answered by UserA
List<Question> NotAnsweredBeforeDate = AllOfTheQuestionsDb.Where(a=>a.Answers.Any(b=>b.DateAnswered < DateTime.Now && b.TheUserWhoAnswerd.Id == UserA)).ToList();
于 2013-02-04T21:56:05.650 に答える
0

これはあなたを近づけるか、良い出発点を与えるはずです:

List<Question> QuestionsUnasweredByUser(User givenUser)
{
    return AllOfTheQuestionsDb
           .Where(q => q.Answers
                        .Any(a => AllOfTheAnswersDb
                                  .Where(na => na.TheUserWhoAnswerd.Id != givenUser.Id)
                                  .ToList().Contains(a)))
           .ToList();
}

List<User> UserAssignedQuestions(bool answered)
{
    return AllOfTheUsersDb
           .Where(u => u.Questions.Count > 0 && 
                       answered ? u.Questions.Any(q=> q.Answers.Count > 0) 
                                : u.Questions.Any(q=>q.Answers.Count == 0)).ToList();
}

List<Question> OverdueQuestions(User givenUser, DateTime dueDate, bool answered)
{
    return AllOfTheQuestionsDb
          .Where(q => (q.Answers.Count == 0 && !answered) || 
                       q.Answers.Any(a => a.TheUserWhoAnswerd.Id == givenUser.Id && 
                                          answered ? a.DateAnswered > dueDate  
                                              : a.DateAnswered <= dueDate)).ToList();
}

List<Answer> OverdueAnswers(User givenUser, DateTime dueDate, bool answered)
{
    return AllOfTheAnswersDb
          .Where(a => a.TheUserWhoAnswerd.Id == givenUser.Id && 
                      answered ? a.DateAnswered < dueDate 
                               : a.DateAnswered <= dueDate).ToList();
}
于 2013-02-04T22:00:36.970 に答える