Выберите отличный Linq
У меня есть таблицы вопросов и ответов в базе данных. Я использовал Join, чтобы выбирать вопросы с ответами и пытался получить вопросы и ответы с помощью LINQ. Вот мой код:
List<Question> newQuestionList =
(from q in dt.AsEnumerable()
where (q.Field<Guid>("Question") != null))
select new Question
{
Oid = q.Field<Guid>("Question"),
QuestionContext = q.Field<String>("QuestionContext"),
Priority = q.Field<Int32>("Priority"),
Order = q.Field<Int32>("OrderQuestion"),
Subject = q.Field<Guid>("Subject"),
Answers = (from a in dt.AsEnumerable()
where a.Field<Guid>("Question") == q.Field<Guid>("Question")
select
new Answer
{
Oid = a.Field<Guid>("AnswerOid"),
AnswerContext = a.Field<String>("Answer"),
IsCorrect = a.Field<bool>("Correct")
}).ToList()
}).Distinct().ToList();
Есть много строк, имеющих один и тот же вопрос (Id). Перебирает все. Мне нужно повторить только один раз для вопроса. Если у меня есть 7 вопросов, и на каждый вопрос есть 4 ответа, этот код дает мне список, число которых равно 28. Его число должно быть 7. Может кто-нибудь помочь?
public class Question
{
private Guid oid;
public Guid Oid
{
get { return oid; }
set { oid = value; }
}
private string questionContext;
public string QuestionContext
{
get { return questionContext; }
set { questionContext = value; }
}
private int priority;
public int Priority
{
get { return priority; }
set { priority = value; }
}
private Guid subject;
public Guid Subject
{
get { return subject; }
set { subject = value; }
}
private List<Answer> answers;
public List<Answer> Answers
{
get { return answers; }
set { answers = value; }
}
private int order;
public int Order
{
get { return order; }
set { order = value; }
}
}
public class Answer
{
private Guid oid;
public Guid Oid
{
get { return oid; }
set { oid = value; }
}
private string answerContext;
public string AnswerContext
{
get { return answerContext; }
set { answerContext = value; }
}
private bool isCorrect;
public bool IsCorrect
{
get { return isCorrect; }
set { isCorrect = value; }
}
}
2 ответа
Я считаю, что вы просто хотите сгруппировать свои вопросы, используя.GroupBy(n=>n.Oid) (я сделал предположение, что каждый вопрос имеет уникальный Oid, так как это Guid)
var questions = (from q in dt.AsEnumerable()
where (q.Field<Guid>("Question") != null))
select new Question
{
Oid = q.Field<Guid>("Question"),
QuestionContext = q.Field<String>("QuestionContext"),
Priority = q.Field<Int32>("Priority"),
Order = q.Field<Int32>("OrderQuestion"),
Subject = q.Field<Guid>("Subject"),
Answers = (from a in dt.AsEnumerable()
where a.Field<Guid>("Question") == q.Field<Guid>("Question")
select new Answer
{
Oid = a.Field<Guid>("AnswerOid"),
AnswerContext = a.Field<String>("Answer"),
IsCorrect = a.Field<bool>("Correct")
}).ToList()
}).GroupBy(n=>n.Oid).ToList();
Это не вернет плоский сбор. Если я правильно понимаю вашу структуру, это вернет 7 уникальных вопросов, которые были объединены с их ответами. Вы можете расправить эту коллекцию, получив первый ответ, если вас не волнуют другие. Вы добавили бы это в свой GroupBy (n => n.Oid) для:
GroupBy(n=>n.Oid).Select(g => g.First()).ToList();
Я думаю, что если вы сначала выполните группировку, то вам не придется перечислять всю таблицу по каждому вопросу.
List<Question> questions =
(from q in dt.AsEnumerable()
where (q.Field<Guid>("Question") != null)
group q by new { Oid = q.Field<Guid>("Question"),
QuestionContext = q.Field<String>("QuestionContext"),
Priority = q.Field<Int32>("Priority"),
Order = q.Field<Int32>("OrderQuestion"),
Subject = q.Field<Guid>("Subject")
} into g
select new Question {
Oid = g.Key.Oid,
QuestionContext = g.Key.QuestionContext,
Priority = g.Key.Priority,
Order = g.Key.Order,
Subject = g.Key.Subject,
Answers = g.Select(a => new Answer()
{
Oid = a.Field<Guid>("AnswerOid"),
AnswerContext = a.Field<String>("Answer"),
IsCorrect = a.Field<bool>("Correct")
}).ToList()
}).ToList();