本文整理汇总了C#中IDataContext.Rates方法的典型用法代码示例。如果您正苦于以下问题:C# IDataContext.Rates方法的具体用法?C# IDataContext.Rates怎么用?C# IDataContext.Rates使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IDataContext
的用法示例。
在下文中一共展示了IDataContext.Rates方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: UpdateTopicInfoByFilter
/// <summary>
/// Обновляет агрегатные данные по темам (таблицу topic_info).
/// Эта процедура сначала удаляет записи соответствующие параметру filter,
/// а потом формирует агрегатные данные и добавляет их в topic_info.
/// Транзакция должна контролироваться вызывающим методом.
/// </summary>
/// <param name="db"></param>
/// <param name="msgPredicate">Необязательный параметр позволяющий задать
/// фильтрацию тем данные по которым нужно пересчитать.
/// Может быть null или string.Empty. Если параметр не задан,
/// обновляются все сообщения. При этом время обновления может быть
/// довольно большим (на Athlon 2100+ 512 MB RAM ~ 1 мин.).
/// Пример: "mid IN (1, 2, 3)" обновит агрегатные значения
/// для тем 1, 2 и 3.</param>
/// <param name="topicPredicate">комплиментарный <see cref="msgPredicate"/> предикат для TopicInfo</param>
/// <returns>Возвращает количество вставленных записей.</returns>
private static int UpdateTopicInfoByFilter(
IDataContext db,
[CanBeNull] Expression<Func<ITopicInfo, bool>> topicPredicate,
[CanBeNull] Expression<Func<IForumMessage, bool>> msgPredicate)
{
// Удаляем.
//
if (topicPredicate != null)
db
.TopicInfos(topicPredicate)
.Delete();
else
db.TopicInfos().Delete();
var rates = db.Rates();
var mods = db.Moderatorials();
var msgs = db.Messages(m => m.TopicID == 0);
if (msgPredicate != null)
msgs = msgs.Where(msgPredicate);
var updated =
msgs
.Into(db.TopicInfos())
.Value(_ => _.MessageID, m => m.ID)
.Value(_ => _.ForumID, m => m.ForumID)
// ReSharper disable once UseCollectionCountProperty
.Value(_ => _.AnswersCount, m => m.TopicAnswers.Count())
.Value(
_ => _.AnswersRates,
m =>
rates
.Where(r => r.Message.TopicID == m.ID && r.RateType > 0)
.Sum(r => (int)r.RateType * r.Multiplier))
.Value(
_ => _.AnswersUnread,
m => m.TopicAnswers.Count(im => !im.IsRead) + (m.IsRead ? 0 : 1))
.Value(
_ => _.AnswersSmiles,
m =>
rates
.Count(r => r.Message.TopicID == m.ID && r.RateType == MessageRates.Smile))
.Value(
_ => _.AnswersAgrees,
m =>
rates
.Count(r => r.Message.TopicID == m.ID && r.RateType == MessageRates.Agree))
.Value(
_ => _.AnswersDisagrees,
m =>
rates
.Count(r => r.Message.TopicID == m.ID && r.RateType == MessageRates.DisAgree))
.Value(
_ => _.AnswersToMeUnread,
m =>
m
.TopicAnswers
.Count(im => !im.IsRead && im.Parent.UserID == Config.Instance.SelfId))
.Value(_ => _.AnswersMarked, m => m.TopicAnswers.Count(im => im.IsMarked))
.Value(_ => _.LastUpdateDate, m => m.TopicAnswers.Max(im => (DateTime?)im.Date) ?? m.Date)
.Value(
_ => _.AnswersModeratorials,
m =>
mods
.Count(
mod =>
mod.Message.TopicID == m.ID
&& (mod.Message.LastModerated == null || mod.Create > mod.Message.LastModerated)))
.Value(_ => _.SelfRates, m => m.Rating())
.Value(_ => _.SelfSmiles, m => m.SmileCount())
.Value(_ => _.SelfAgrees, m => m.AgreeCount())
.Value(_ => _.SelfDisagrees, m => m.DisagreeCount())
.Value(_ => _.SelfModeratorials, m => m.ActiveModeratorialCount())
.Insert();
return updated;
}
示例2: AddNewRates
private static void AddNewRates(
IDataContext db,
JanusRatingInfo[] rates,
Action<int, int> progressHandler)
{
var processed = 0;
foreach (var rate in rates)
{
// Могут встречаться случаи (+/- && :) && оценка). +, - и :)
// выражаются отрицательными константами. Так же может приходить
// команда на удаление всего рейтинга.
var localRate = rate;
var rateType = (MessageRates) rate.rate;
if (rateType == MessageRates.DeleteRate)
{
db
.Rates(r => r.MessageID == localRate.messageId
&& r.UserID == localRate.userId)
.Delete();
continue;
}
var q =
db
.Rates(
r =>
r.MessageID == localRate.messageId
&& r.UserID == localRate.userId);
if (rateType == MessageRates.Agree || rateType == MessageRates.DisAgree)
q = q.Where(
r =>
r.RateType == MessageRates.Agree
|| r.RateType == MessageRates.DisAgree);
else if (rateType <= 0)
q = q.Where(r => r.RateType == rateType);
else
q = q.Where(r => r.RateType > MessageRates.DisAgree);
var oldRate =
q
.Select(r => (MessageRates?)r.RateType)
.SingleOrDefault();
var newRate = rate;
if (!oldRate.HasValue)
db
.Rates()
.Value(_ => _.MessageID, newRate.messageId)
.Value(_ => _.TopicID, newRate.topicId)
.Value(_ => _.UserID, newRate.userId)
.Value(_ => _.RateType, rateType)
.Value(_ => _.Multiplier, newRate.userRating)
.Value(_ => _.Date, newRate.rateDate)
.Insert();
else
db
.Rates(
r =>
r.MessageID == newRate.messageId
&& r.UserID == newRate.userId
&& r.RateType == oldRate)
.Set(_ => _.TopicID, () => newRate.topicId)
.Set(_ => _.RateType, () => rateType)
.Set(_ => _.Multiplier, () => newRate.userRating)
.Set(_ => _.Date, () => newRate.rateDate)
.Update();
processed++;
progressHandler?.Invoke(rates.Length, processed);
}
}