Я попытался создать этот 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();
0
schumacherj 20 Янв 2014 в 05:24
Можете ли вы предоставить образцы данных и примеры различных вызовов, которые возвращают разные данные?
 – 
Brendan Green
20 Янв 2014 в 05:55
Хорошо, я добавлю кое-что в конце вопроса.
 – 
schumacherj
20 Янв 2014 в 06:03
Форматирование в порядке?
 – 
schumacherj
20 Янв 2014 в 06:17
И вы ищете оператор Linq для извлечения данных или TSQL?
 – 
Brendan Green
20 Янв 2014 в 06:20
Linq был бы потрясающим, я пытался это сделать, но, должно быть, я сделал ошибку, потому что возвращенные значения были другими.
 – 
schumacherj
20 Янв 2014 в 06:22

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.

1
Brendan Green 20 Янв 2014 в 07:07
Должны отображаться все пользователи, которые находятся в одной команде, но я могу заставить их работать. Это просто дополнительное предложение where.
 – 
schumacherj
20 Янв 2014 в 07:17