Как я могу получить количество проданных членов - PullRequest
2 голосов
/ 10 сентября 2011

Привет, у меня есть таблица членства с колонками ...

memberToMship_Id
memberToMship_StartDate 
memberToMship_EndDate
memberToMship_JoinFee
memberToMship_ChargePerPeriod
memberToMship_InductionFee
mshipOption_Id

и у меня есть еще одна таблица под названием mshipoptions со столбцами

   mshipOption_Id
   mshipOption_Period
   mshipType_Id 

и у меня есть еще одна таблица mshiptypes

  mshipType_Id
  mshipType_Name

и мое имя для текстового контекста: tsgdbcontext

как я могу преобразовать приведенный ниже запрос в linq

"SELECT mshipType_Name, COUNT('A') AS mshipssold,
                                sum(memberToMship_InductionFee+memberToMship_JoinFee+
                                  (IF(mshipOption_Period='year',
                                  TIMESTAMPDIFF (YEAR ,memberToMship_StartDate, memberToMship_EndDate),
                                  TIMESTAMPDIFF (MONTH ,memberToMship_StartDate, memberToMship_EndDate)) * memberToMship_ChargePerPeriod)) as value
                              FROM membertomships
                              inner join mshipoptions on membertomships.mshipOption_Id = mshipoptions.mshipOption_Id
                              inner join mshiptypes on mshipoptions.mshipType_Id = mshiptypes.mshipType_Id
                              WHERE memberToMship_StartDate BETWEEN '2010-09-08' AND '2011-09-06'
                              GROUP BY mshipType_Name

Я пробовал что-то вроде этого:

Модифицированный код:

  DateTime dateFrom = new DateTime(2010, 9, 8); 
 DateTime dateTo = new DateTime(2001, 9, 6); 

 var query = from m in tsgdbcontext.membertomship
              where m.memberToMship_StartDate  >= dateFrom && m.memberToMship_StartDate <=    dateTo 
               group m by m.mshipType_Name

Я не знаю точно, что мне делать дальше

Ответы [ 2 ]

2 голосов
/ 10 сентября 2011

Предположим, что у вас настроены классы с ассоциациями, такими как (с использованием CodeFirst EF).Если вы используете конструктор, тогда используйте ассоциации и классы, как вы их определили.

public class MemberToMembership
{
    [Key] // maybe also DatabaseGenerated.Identity?
    public virtual int Id { get; set; }
    public virtual DateTime StartDate { get; set; }
    public virtual DateTime StartDate { get; set; }
    public virtual decimal JoinFee { get; set; }
    public virtual decimal ChargePerPeriod { get; set; }
    public virtual decimal InductionFee { get; set; }
    public virtual int OptionId { get; set; }

    [ForeignKey("OptionId")]
    public virtual MembershipOption Option { get; set; }
}

public class MembershipOption
{
    [Key]
    public virtual int Id { get; set; }

    public virtual string Period { get; set; }

    public virtual int TypeId { get; set; }

    [ForeignKey("TypeId")]
    public virtual MembershipType Type { get; set; }

    public virtual ICollection<MemberToMembership> MemberMap { get; set; }
}

public class MembershipType
{
     [Key]
     public virtual int Id { get; set; }

     public virtual string Name { get; set; }

     public virtual ICollection<MembershipOption> Options { get; set; }
}

Теперь мы можем воспользоваться связями, чтобы помочь сформировать запрос.

var dateFrom = new DateTime(2010, 9, 8); // start of day we care about
var dateTo = new DateTime(2011, 9, 6).AddDays(1); // end of day we care about
var query = tgsdbcontext.MemberToMemberships
                        .Where( mm => mm.StartDate > dateFrom && mm.StartDate < dateTo )
                        .GroupBy( mm => mm.Option.Type.Name )
                        .Select( g => new
                         {
                             Period = g.Key,
                             Count = g.Count(),
                             Value = g.Sum( e => e.JoinFee
                                                   + e.InductionFee
                                                   + (e.Option.Period == "year"
                                                        ? EntityFunctions.DiffYears(e.StartDate,e.EndDate) * e.ChargePerPeriod
                                                        : EntityFunctions.DiffMonths(e.StartDate,e.EndDate) * e.ChargePerPeriod))
                          });
1 голос
/ 10 сентября 2011

Попробуйте что-то вроде этого:

DateTime dateFrom = new DateTime(2010, 9, 8); 
DateTime dateTo = new DateTime(2001, 9, 6);

var query = from t1 in tsgdbcontext.membertomship
    join t2 in tsgdbcontext.mshipoptions on t1.mshipOption_Id equals t2.mshipOption_Id
    join t3 in tsgdbcontext.mshiptypes on t1.mshipType_Id equals t3.mshipType_Id
    where t1.memberToMship_StartDate  >= dateFrom && 
        t1.memberToMship_StartDate <= dateTo 
    group t1 by t1.mshipType_Name into g
    select new { 
        mshipType_Name = g.Key, 
        mshipssold = g.Count(), 
        value = (from x in g select memberToMship_InductionFee +        
            memberToMship_JoinFee + ((mshipOption_Period = 'year' ? 
                memberToMship_EndDate.Year - memberToMship_StartDate.Year : 
                ConvertTimeSpanToMonths(memberToMship_EndDate - 
                memberToMship_StartDate)) * memberToMship_ChargePerPeriod)
        ).Sum()
    }

ПРИМЕЧАНИЕ. Приведенный выше код не проверен, поэтому может потребоваться его настройка, но это должно дать вам общее представление о том, как это сделать

Вам потребуется написать или скопировать одно из доступных решений для метода ConvertTimeSpanToMonths, чтобы преобразовать интервал времени в месяцы. Вот ссылка на то, что вы можете использовать: Примеры вычитания даты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...