C# 我怎样才能获得会员资格

C# 我怎样才能获得会员资格,c#,.net,linq,entity-framework,linq-to-entities,C#,.net,Linq,Entity Framework,Linq To Entities,嗨,我有一个名为membertomship的表,有列 memberToMship_Id memberToMship_StartDate memberToMship_EndDate memberToMship_JoinFee memberToMship_ChargePerPeriod memberToMship_InductionFee mshipOption_Id 我还有另一个名为mshippoptions的表,其中有列 mshipOption_Id mshipOption_Pe

嗨,我有一个名为membertomship的表,有列

memberToMship_Id
memberToMship_StartDate 
memberToMship_EndDate
memberToMship_JoinFee
memberToMship_ChargePerPeriod
memberToMship_InductionFee
mshipOption_Id
我还有另一个名为mshippoptions的表,其中有列

   mshipOption_Id
   mshipOption_Period
   mshipType_Id 
我还有另外一张桌子

  mshipType_Id
  mshipType_Name
我的datacontext名称是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 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()
    }
修改代码:

  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
DateTime dateFrom=newdatetime(2010,9,8);
DateTime dateTo=新的日期时间(2001,9,6);
var query=来自tsgdbcontext.membertomship中的m

其中m.memberToMship\u StartDate>=dateFrom&&m.memberToMship\u StartDate尝试以下操作:

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()
    }
DateTime dateFrom=newdatetime(2010,9,8);
DateTime dateTo=新的日期时间(2001,9,6);
var query=来自tsgdbcontext.membertomship中的t1
在t1.mshipOption_Id等于t2.mshipOption_Id的tsgdbcontext.mshipoptions中加入t2
将t3连接到t1上的tsgdbcontext.mshiptypes中。mshipType_Id等于t3.mshipType_Id
其中t1.memberToMship\u StartDate>=日期从&&

t1.memberToMship_StartDate让我们假设您已使用关联设置了类,例如(使用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; }
}
公共类成员身份
{
[Key]//也可能是数据库生成的。标识?
公共虚拟整数Id{get;set;}
公共虚拟日期时间起始日期{get;set;}
公共虚拟日期时间起始日期{get;set;}
公共虚拟十进制JoinFee{get;set;}
公共虚拟十进制ChargePerPerPerPerPerPerPerPeriod{get;set;}
公共虚拟十进制导入费{get;set;}
公共虚拟int OptionId{get;set;}
[外键(“选项ID”)]
公共虚拟成员身份选项{get;set;}
}
公共类成员资格选项
{
[关键]
公共虚拟整数Id{get;set;}
公共虚拟字符串周期{get;set;}
公共虚拟int-TypeId{get;set;}
[外键(“类型ID”)]
公共虚拟成员身份类型{get;set;}
公共虚拟ICollection成员映射{get;set;}
}
公共类成员类型
{
[关键]
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟ICollection选项{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))
                          });
var dateFrom=new DateTime(2010,9,8);//我们关心的一天的开始
var dateTo=新的日期时间(2011,9,6).AddDays(1);//我们关心的一天结束了
var query=tgsdbcontext.MemberToMemberships
其中(mm=>mm.StartDate>dateFrom&&mm.StartDatemm.Option.Type.Name)
.选择(g=>new
{
周期=g键,
Count=g.Count(),
Value=g.Sum(e=>e.JoinFee
+e.入职费
+(e.Option.Period==“年”
?实体功能。不同年份(如开始日期、结束日期)*如计费周期
:EntityFunctions.DiffMonths(e.StartDate,e.EndDate)*e.ChargePerPerPerPerPerPerPeriod))
});

你能展示一下到目前为止你用LINQ做了什么吗?@Davide Piras你能看看我修改过的代码吗。。。我试过类似的方法,但不能得到正确的答案。你能帮我。。。