есть длинная хранимая процедура
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
ALTER PROCEDURE [dbo].[PR_FilteredDialogList]
@DateStart datetime,
@DateEnd datetime,
@PageNumber int,
@PageSize int,
@KeyWord varchar(256),
@TotalDialogsFound int OUTPUT --кстати в чём различие деректив OUTPUT и OUT они обе работают вроде одинаково, я сначала писал OUT , но теперь пишу OUTPUT от греха
AS
BEGIN
--Что здесь не так важно , она работает и нормально записывает TotalDialogsFound
-- вобщем перед тем как отрезать нужную страничку делается что типа такого:
Select @TotalDialogsFound=COUNT(Linenumber) FROM @Result
END
есть в репозитарии обслуживающим контроллер следующий код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
public IList<DialogInfoModel> GetAdmDialogsPageList(int pageNumber, int pageSize, DateTime activityDateTimeBegin, DateTime activityDateTimeEnd, string keyWord, out int totalPages)
{
IList<DialogInfoModel> result = null;
totalPages = 0;
try
{
var totalDialogsFound = new ObjectParameter("TotalDialogsFound",0);
var dlgList = Context.PR_FilteredDialogList(activityDateTimeBegin, activityDateTimeEnd, pageNumber, pageSize, keyWord, totalDialogsFound);
var userRepository = new UserDataRepository(Context);
result = (from prDlgListResult in dlgList
let dialogBeginer = userRepository.GetUserBaseById(prDlgListResult.DialogBeginnerId)
let interlocutor = userRepository.GetUserBaseById(prDlgListResult.InterlocutorId)
let lastSender = interlocutor.UserId == prDlgListResult.LastSenderId ? interlocutor : dialogBeginer
let lastMessage = Context.Messages.FirstOrDefault(m => m.MessageId == prDlgListResult.LastMessageId)
select new DialogInfoModel(dialogBeginer, interlocutor, prDlgListResult.MessagesCount.HasValue ? prDlgListResult.MessagesCount.Value : 0, new MessageModel(lastMessage, lastSender.UserId), lastSender)
).ToList();
int itotalDialogsFound = (int)totalDialogsFound.Value; //я не понимаю с чем связан этот глюк Entity framework, но totalDialogsFound нормальным образом не означивался , до тех пор пока не вызван обход значений полученых в dlgList , т.е. там лежало число записаненое при инициализации и оператор наданной строке нельзя менять с предыдущем ,перестаёт работать
totalPages = itotalDialogsFound / pageSize;
if (totalPages * pageSize < itotalDialogsFound) totalPages++;
}
catch(Exception ex)
{
Logger.LogError(ex);
}
return result;
}
Собственно вопрос - в коментарии С# кода - он рабочий, и в totalPages - лежит ожидаемое число
а вот код ниже (казалось бы идентичный , не работает), его я написал ранее
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public IList<DialogInfoModel> GetAdmDialogsPageList(int pageNumber, int pageSize, DateTime activityDateTimeBegin, DateTime activityDateTimeEnd, string keyWord, out int totalPages)
{
IList<DialogInfoModel> result = null;
totalPages = 0;
try
{
var totalDialogsFound = new ObjectParameter("TotalDialogsFound",0);
var dlgList = Context.PR_FilteredDialogList(activityDateTimeBegin, activityDateTimeEnd, pageNumber, pageSize, keyWord, totalDialogsFound);
int itotalDialogsFound = (int)totalDialogsFound.Value;//вот так не работает totalDialogsFound - не обновляется, там лежит старое значение.
totalPages = itotalDialogsFound / pageSize;
if (totalPages * pageSize < itotalDialogsFound) totalPages++;
var userRepository = new UserDataRepository(Context);
result = (from prDlgListResult in dlgList
let dialogBeginer = userRepository.GetUserBaseById(prDlgListResult.DialogBeginnerId)
let interlocutor = userRepository.GetUserBaseById(prDlgListResult.InterlocutorId)
let lastSender = interlocutor.UserId == prDlgListResult.LastSenderId ? interlocutor : dialogBeginer
let lastMessage = Context.Messages.FirstOrDefault(m => m.MessageId == prDlgListResult.LastMessageId)
select new DialogInfoModel(dialogBeginer, interlocutor, prDlgListResult.MessagesCount.HasValue ? prDlgListResult.MessagesCount.Value : 0, new MessageModel(lastMessage, lastSender.UserId), lastSender)
).ToList();
}
catch(Exception ex)
{
Logger.LogError(ex);
}
return result;
}
Часов 5 бился головой об стену, не понимая почему код ниже не работает, перепробывал всё, даже help читал, нашёл где то текст что output параметры означиваются после обхода результирующего значения если процедура возвращает IList<Type T> , не уверен что я понял текст правльно, но это помогло...
Объясните, пожалуйста, почему, шибко интересно :) .