Я попытался создать этот sql-скрипт из t-sql в Linq в sql, но он не возвращает одни и те же данные оба раза.
Входными данными должны быть @qid, которое является целым числом, и @userid, которое также является целым числом. Результатом является последний ответ каждого пользователя на основе DateCreated.
Действительный код приведен ниже:
DECLARE @userid int;
DECLARE @qid int;
DECLARE @userteamid int;
DECLARE @questionidList TABLE
( QuestionId int);
DECLARE @teamhistory TABLE
( Id int,
Userid int,
DateCreated datetime2,
UserName nvarchar(35)
);
SET @userid=3
SET @qid=2
SET @userteamid = (SELECT TeamId
FROM UserProfile
WHERE UserId=@userid);
INSERT INTO
@questionidList
SELECT Questions.QuestionId
FROM Questions
INNER JOIN TeamQuestionRosters ON Questions.QuestionId=TeamQuestionRosters.QuestionId
WHERE TeamId=@userteamid
AND Questions.QuestionId=@qid;
INSERT INTO
@teamhistory (Id, UserName, Userid, DateCreated)
SELECT
d.ResponseId AS Id, f.UserName AS UserName, f.UserId AS Userid, c.DateCreated AS DateCreated
FROM Responses as c
INNER JOIN ResponseDetails AS d ON c.ResponseId=d.ResponseId
INNER JOIN UserProfile as f on c.UserProfileId=f.UserId
WHERE c.QuestionId IN (SELECT QuestionId FROM @questionidList)
SELECT b.Id, b.DateCreated, b.UserName FROM @teamhistory AS b
WHERE b.datecreated =
(SELECT MAX(a.DateCreated)
FROM @teamhistory AS a
WHERE a.Userid=b.Userid)
Последний оператор Select - это то, откуда должны поступать выходные / возвращаемые данные. Вот часть таблицы ответов:
+---+---+------+---------------------+------+-------+------+
|ID |QID|UserID|DateCreated |BS |Reason |UserID|
+---+---+------+---------------------+------+-------+------+
|140|2 |3 |1/14/2014 04:57:48 PM|0.3200|60 test|3 |
+---+---+------+---------------------+------+-------+------+
|141|2 |3 |1/14/2014 04:58:32 PM|0.3200|60 test|3 |
+---+---+------+---------------------+------+-------+------+
|142|2 |3 |1/14/2014 04:58:46 PM|0.3200|60 test|3 |
+---+---+------+---------------------+------+-------+------+
|149|2 |4 |1/19/2014 12:00:00 AM|0.0000|reason2|4 |
+---+---+------+---------------------+------+-------+------+
|150|2 |4 |1/15/2014 12:00:00 AM|0.0000|dfknl |4 |
+---+---+------+---------------------+------+-------+------+
|151|2 |4 |1/15/2014 12:00:00 AM|0.0000|dkfjnbs|4 |
+---+---+------+---------------------+------+-------+------+
|152|2 |4 |1/05/2014 12:00:00 AM|0.0000|dskfljn|4 |
+---+---+------+---------------------+------+-------+------+
|153|2 |222 |1/16/2014 12:00:00 AM|0.0000|lksdnf |222 |
+---+---+------+---------------------+------+-------+------+
Вот таблица вопросов с одной строкой для простоты:
+--+---------------+----------------------+---------+---------+-----------+
|Id|Title |DateCreated |Keywords |is_active|Description|
+--+---------------+----------------------+---------+---------+-----------+
|2 |Random Question|10/19/2013 12:00:00 AM|Something|True |Random text|
+--+---------------+----------------------+---------+---------+-----------+
Это правильный вывод:
+---+----------------------+--------+
|Id |DateCreated |UserName|
+---+----------------------+--------+
|153|01/16/2014 12:00:00 AM|dtaver |
+---+----------------------+--------+
|149|01/19/2014 12:00:00 AM|lbryan |
+---+----------------------+--------+
|142|01/14/2014 04:58:46 PM|jsteve |
+---+----------------------+--------+
Моя попытка превратить это в Linq:
int userid= WebSecurity.GetUserId(User.Identity.Name);
int qid=2; //question id
int userteamid = (from w in db.UserProfiles
where w.UserId.Equals(userid)
select w.TeamId).First().Value;
var query3 = (from c in db.Responses
join d in db.ResponseDetails on c.ResponseId equals d.ResponseId
join f in db.UserProfiles on c.UserProfile.UserId equals f.UserId
where c.QuestionId==qid
select new TeamForecastHistory {
Id = d.ResponseId,
Reason = c.Reason,
UserName = f.UserName,
DateCreated = c.DateCreated
}).ToList();
ViewBag.info = (from a in query3
where a.DateCreated.Equals((from b in query3
where a.Userid==b.Userid
select b.DateCreated).Max())
select new TeamForecastHistory { Id = a.Id,
Reason = a.Reason,
UserName = a.UserName,
DateCreated = a.DateCreated
}).ToList();
1 ответ
Неясно, хотите ли вы указать самый последний ответ для всех пользователей или только для конкретного пользователя.
Учитывая ограниченную модель данных, которую вы предоставили, следующие запросы linq будут делать то, что вы хотите. Вам придется адаптировать их для включения дополнительных таблиц, к которым вы хотите присоединиться (если вы не используете какие-либо данные из них, просто игнорируйте их.
Получить последний ответ для конкретного пользователя на конкретный вопрос:
var resp = (from r in Responses where r.QID == 1 && r.UserId == userId && r.DateCreated == (from maxResp in Responses where maxResp.UserId == r.UserId && maxResp.QID == r.QID select maxResp.DateCreated).Max() select r);
Получите последний ответ для всех пользователей на конкретный вопрос:
var respAll = (from r in Responses where r.QID == 1 && r.DateCreated == (from maxResp in Responses where maxResp.UserId == r.UserId && maxResp.QID == r.QID select maxResp.DateCreated).Max() select r);
Если вы хотите получить все вопросы, просто удалите предложение r.QID == 1
.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.