C# 我怎样才能获得会员资格
嗨,我有一个名为membertomship的表,有列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_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你能看看我修改过的代码吗。。。我试过类似的方法,但不能得到正确的答案。你能帮我。。。