tblQuestion
-----------
questionId question userId
--------------------------------------
1 question 1 1
2 question 2 2
tblVotes
--------
voteId userId questionId
----------------------------------------
1 1 1
2 2 1
3 3 1
4 1 2
Как вы можете видеть выше, у меня есть две таблицы, таблица вопросов и таблица голосов. Каждый вопрос может иметь количество голосов, которое представлено в таблице голосов, поскольку таблица голосов связана с идентификатором вопроса.
Если бы у меня была функция на сервере, например:
public IActionResult GetPollsVoted(string userId)
Я хочу, чтобы идентификатор пользователя был передан так, чтобы результаты были такими, если переданный идентификатор пользователя равен "1":
tblResults
----------
questionId question userId voteCount
-------------------------------------------------
1 question 1 1 3
2 question 2 1 1
Я знаю, что я все еще пытаюсь понять этот сценарий, поскольку я пытаюсь использовать linq в С# для получения результатов, указанных выше, так как я могу добиться этого, используя ссылку, чтобы получить повторное использование ответа tblResults?
Я пробовал это, но все еще не могу заставить эту команду linq работать:
polls1 = from c in ctx.TblPolls
join o in ctx.TblVotes on c.UserId equals o.UserId into g
group c.UserId by c.Guid into gg
from d in ctx.TblPolls
join m in ctx.TblVotes on d.Guid equals m.PollGuid into ggg
select new { d.Question, Count = ggg.Count() };
Таблицы в linq не соответствуют примеру, который я вам показал, но tblQuestions равен ctx.TblPolls, а tblVotes равен ctxTblVotes, d.Guid равен questionId в tblQuestion, а m.PollGuid равен questionId в tblVotes как ссылка на обе таблицы. Идентификатор пользователя говорит сам за себя.
так как я могу получить результаты, которые я хочу, используя linq?





Я думаю, что правильно подчистил ваши имена. Вот немного более читаемая версия вашего ответа, который вы опубликовали:
var TblPolls = new[]
{
new { Guid = 1, Question = "question 1", UserId = 1 },
new { Guid = 2, Question = "question 2", UserId = 2 },
};
var TblVotes = new[]
{
new { VoteId = 1, UserId = 1, PollGuid = 1 },
new { VoteId = 2, UserId = 2, PollGuid = 1 },
new { VoteId = 3, UserId = 3, PollGuid = 1 },
new { VoteId = 4, UserId = 1, PollGuid = 2 },
};
var userId = 1;
var polls =
(
from vote in TblVotes
where vote.UserId == userId
join poll in TblPolls on vote.PollGuid equals poll.Guid
join vote2 in TblVotes on poll.Guid equals vote2.PollGuid into votes
select new
{
poll.Question,
Count = votes.Count(),
}
).ToList();
Данные вашего примера или тип данных отличаются от вашего запроса. я пытаюсь использовать пример и ваш запрос
public IActionResult GetPollsVoted(string userId)
{
int _userid = int.Parse(userId);
var _listuser = _db.TblPolls
.Join(_db.TblVotes,
p => p.Id,
e => e.questionId,
(p, e) => new
{
Polls = p,
Votes = e
}
).Where(d => d.Votes.userId == _userid && d.Polls.userId == _userid)
.GroupBy(d => d.Votes.questionId).Select(d => new
{
questionId = d.Key,
question = d.FirstOrDefault().Polls.question,
userId = _userid,
voteCount = d.Count()
}).ToList();
Результат:
Пример даты
Guid iD = Guid.NewGuid();
Guid iD2 = Guid.NewGuid();
_db.TblPolls.Add(new TblPoll() { Id= iD, userId = 1, question = "question 1"});
_db.TblPolls.Add(new TblPoll() { Id = iD2, userId = 2, question = "question 2" });
_db.TblVotes.Add(new TblVote() { userId = 1, questionId = iD });
_db.TblVotes.Add(new TblVote() { userId = 1, questionId = iD });
_db.TblVotes.Add(new TblVote() { userId = 1, questionId = iD });
_db.TblVotes.Add(new TblVote() { userId = 2, questionId = iD2 });
Ваши таблицы и ваш код не совпадают. Ужасно сложно составить ответ и понять, верен ли он. В идеале вы должны опубликовать свои исходные данные как действительный код C#, а не таблицы. Не могли бы вы исправить свой вопрос?