C# RavenDB映射缩减函数
我正在尝试为索引编写一个RavenDB Map Reduce函数,以整理来自一组域模型的信息。我无法填充所有的结果字段,但我已经花了一天左右的时间,并且遗漏了一些我认为基本的东西 这是:C# RavenDB映射缩减函数,c#,indexing,mapreduce,ravendb,C#,Indexing,Mapreduce,Ravendb,我正在尝试为索引编写一个RavenDB Map Reduce函数,以整理来自一组域模型的信息。我无法填充所有的结果字段,但我已经花了一天左右的时间,并且遗漏了一些我认为基本的东西 这是: public class All_Groups : AbstractMultiMapIndexCreationTask<All_Groups.Result> { public class Result { public string Type { get; set;
public class All_Groups : AbstractMultiMapIndexCreationTask<All_Groups.Result>
{
public class Result
{
public string Type { get; set; }
public string Id { get; set; }
public string ChildId { get; set; }
public string Name { get; set; }
public string GroupType { get; set; }
public int MemberCount { get; set; }
public int ProjectCount { get; set; }
public int TeamCount { get; set; }
public int OrganisationCount { get; set; }
public int ChildGroupCount { get; set; }
public AppRoot AppRoot { get; set; }
public Organisation Organisation { get; set; }
public Team Team { get; set; }
public Project Project { get; set; }
public UserProject UserProject { get; set; }
}
public All_Groups()
{
AddMap<AppRoot>(appRoots => from appRoot in appRoots
select new
{
Type = "group",
appRoot.Id,
ChildId = (string)null,
appRoot.Name,
GroupType = "approot",
MemberCount = 0,
ProjectCount = 0,
TeamCount = 0,
OrganisationCount = 0,
ChildGroupCount = 0
});
AddMap<Organisation>(organisations => from organisation in organisations
select new
{
Type = "group",
organisation.Id,
ChildId = (string)null,
organisation.Name,
GroupType = "organisation",
MemberCount = 0,
ProjectCount = 0,
TeamCount = 0,
OrganisationCount = 1,
ChildGroupCount = 0
});
AddMap<Team>(teams => from team in teams
select new
{
Type = "group",
team.Id,
ChildId = (string)null,
team.Name,
GroupType = "team",
MemberCount = 0,
ProjectCount = 0,
TeamCount = 1,
OrganisationCount = 0,
ChildGroupCount = 0
});
AddMap<Project>(projects => from project in projects
select new
{
Type = "group",
project.Id,
ChildId = (string)null,
project.Name,
GroupType = "project",
MemberCount = 0,
ProjectCount = 1,
TeamCount = 0,
OrganisationCount = 0,
ChildGroupCount = 0
});
AddMap<UserProject>(userProjects => from userProject in userProjects
select new
{
Type = "group",
userProject.Id,
ChildId = (string)null,
userProject.Name,
GroupType = "userproject",
MemberCount = 0,
ProjectCount = 0,
TeamCount = 0,
OrganisationCount = 0,
ChildGroupCount = 0
});
AddMap<GroupAssociation>(groupAssociations => from groupAssociation in groupAssociations
select new
{
Type = "groupassociation",
Id = groupAssociation.ParentGroupId,
ChildId = groupAssociation.ChildGroupId,
Name = "n/a",
GroupType = "groupassociation",
MemberCount = 0,
ProjectCount = 0,
TeamCount = 0,
OrganisationCount = 0,
ChildGroupCount = 1
});
AddMap<Member>(members => from member in members
select new
{
Type = "member",
member.Id,
ChildId = (string)null,
Name = "n/a",
GroupType = "member",
MemberCount = 1,
ProjectCount = 0,
TeamCount = 0,
OrganisationCount = 0,
ChildGroupCount = 0
});
Reduce = results => from result in results
group result by result.Id
into g
select new
{
g.Where(x => x.Id == g.Key).First().Type,
Id = g.Key,
g.Where(x => x.Id == g.Key).First().ChildId,
g.Where(x => x.Id == g.Key).First().Name,
g.Where(x => x.Id == g.Key).First().GroupType,
MemberCount = g.Where(x => x.Id == g.Key && x.Type == "member").Sum(x => x.MemberCount),
ProjectCount = g.Where(x => x.GroupType == "project").Sum(x => x.ProjectCount),
TeamCount = g.Where(x => x.GroupType == "team").Sum(x => x.TeamCount),
OrganisationCount = g.Where(x => x.GroupType == "organisation").Sum(x => x.OrganisationCount),
ChildGroupCount = g.Where(x => x.GroupType == "groupassociation" && x.Id == g.Key).Sum(x => x.ChildGroupCount)
};
TransformResults = (database, results) =>
from result in results
let appRoot = database.Load<AppRoot>(result.Id)
let organisation = database.Load<Organisation>(result.Id)
let team = database.Load<Team>(result.Id)
let project = database.Load<Project>(result.Id)
let userProject = database.Load<UserProject>(result.Id)
select new
{
result.Id,
result.Type,
result.Name,
result.GroupType,
AppRoot = appRoot,
Organisation = organisation,
Team = team,
Project = project,
UserProject = userProject,
result.MemberCount,
result.ProjectCount,
result.TeamCount,
result.OrganisationCount,
result.ChildGroupCount
};
Store(x => x.Type, FieldStorage.Yes);
Store(x => x.Id, FieldStorage.Yes);
Store(x => x.Name, FieldStorage.Yes);
Store(x => x.GroupType, FieldStorage.Yes);
Store(x => x.MemberCount, FieldStorage.Yes);
Store(x => x.ProjectCount, FieldStorage.Yes);
Store(x => x.TeamCount, FieldStorage.Yes);
Store(x => x.OrganisationCount, FieldStorage.Yes);
Store(x => x.ChildGroupCount, FieldStorage.Yes);
}
}
public类所有组:AbstractMultiMapIndexCreationTask)
我一直在为这个扯我的头发,它就快到了,但我需要一些新鲜的眼睛,有人吗
干杯
哈米什 结果是它比我在上面做的要简单一点。我试图解决的问题是:
Approt是我的应用程序和域模型的根级别的组。可以是组织、团队或项目的组可以被链接为Approt的子级,或者按照组织拥有团队、团队拥有项目的顺序链接
还有一些用户项目作为Approt的关联存在
我需要统计每个项目中的所有成员,以及每个项目中的子项目,这就是下面Map Reduce函数使用域模型对象GroupAssociation所做的
有关更多详细信息,请参见上面的链接域模型图:
public class All_Groups : AbstractMultiMapIndexCreationTask<All_Groups.Result>
{
public class Result
{
public string Type { get; set; }
public string GroupType { get; set; }
public string Id { get; set; }
public int GroupMemberCount { get; set; }
public int TeamProjectCount { get; set; }
public int OrganisationTeamCount { get; set; }
public int AppRootOrganisationCount { get; set; }
public int AppRootUserProjectCount { get; set; }
public int AppRootTeamCount { get; set; }
public int AppRootProjectCount { get; set; }
public Group Group { get { return AppRoot ?? Organisation ?? Team ?? Project ?? UserProject ?? (Group)null; } }
public AppRoot AppRoot { get; set; }
public Organisation Organisation { get; set; }
public Team Team { get; set; }
public Project Project { get; set; }
public UserProject UserProject { get; set; }
}
public All_Groups()
{
AddMap<AppRoot>(appRoots => from appRoot in appRoots
select new
{
Type = "group",
GroupType = "approot",
appRoot.Id,
GroupMemberCount = 0,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
AddMap<Organisation>(organisations => from organisation in organisations
select new
{
Type = "group",
GroupType = "organisation",
organisation.Id,
GroupMemberCount = 0,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
AddMap<Team>(teams => from team in teams
select new
{
Type = "group",
GroupType = "team",
team.Id,
GroupMemberCount = 0,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
AddMap<Project>(projects => from project in projects
select new
{
Type = "group",
GroupType = "project",
project.Id,
GroupMemberCount = 0,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
AddMap<UserProject>(userProjects => from userProject in userProjects
select new
{
Type = "group",
GroupType = "userproject",
userProject.Id,
GroupMemberCount = 0,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
AddMap<GroupAssociation>(groupAssociations => from groupAssociation in groupAssociations
select new
{
Type = "groupassociation",
GroupType = (string)null,
Id = groupAssociation.ParentGroupId,
GroupMemberCount = 0,
TeamProjectCount = groupAssociation.ParentGroupType == "team" && groupAssociation.ChildGroupType == "project" ? 1 : 0,
OrganisationTeamCount = groupAssociation.ParentGroupType == "organisation" && groupAssociation.ChildGroupType == "team" ? 1 : 0,
AppRootOrganisationCount = groupAssociation.ParentGroupType == "approot" && groupAssociation.ChildGroupType == "organisation" ? 1 : 0,
AppRootUserProjectCount = groupAssociation.ParentGroupType == "approot" && groupAssociation.ChildGroupType == "userproject" ? 1 : 0,
AppRootTeamCount = groupAssociation.ParentGroupType == "approot" && groupAssociation.ChildGroupType == "team" ? 1 : 0,
AppRootProjectCount = groupAssociation.ParentGroupType == "approot" && groupAssociation.ChildGroupType == "project" ? 1 : 0
});
AddMap<Member>(members => from member in members
select new
{
Type = "member",
GroupType = (string)null,
member.Group.Id,
GroupMemberCount = 1,
TeamProjectCount = 0,
OrganisationTeamCount = 0,
AppRootOrganisationCount = 0,
AppRootUserProjectCount = 0,
AppRootTeamCount = 0,
AppRootProjectCount = 0
});
Reduce = results => from result in results
group result by result.Id
into g
select new
{
Type = g.Select(x => x.Type).FirstOrDefault(),
GroupType = g.Select(x => x.GroupType).FirstOrDefault(),
Id = g.Key,
GroupMemberCount = g.Sum(x => x.GroupMemberCount),
TeamProjectCount = g.Sum(x => x.TeamProjectCount),
OrganisationTeamCount = g.Sum(x => x.OrganisationTeamCount),
AppRootOrganisationCount = g.Sum(x => x.AppRootOrganisationCount),
AppRootUserProjectCount = g.Sum(x => x.AppRootUserProjectCount),
AppRootTeamCount = g.Sum(x => x.AppRootTeamCount),
AppRootProjectCount = g.Sum(x => x.AppRootProjectCount)
};
TransformResults = (database, results) =>
from result in results
let appRoot = database.Load<AppRoot>(result.Id)
let organisation = database.Load<Organisation>(result.Id)
let team = database.Load<Team>(result.Id)
let project = database.Load<Project>(result.Id)
let userProject = database.Load<UserProject>(result.Id)
select new
{
result.Type,
result.GroupType,
result.Id,
result.GroupMemberCount,
result.TeamProjectCount,
result.OrganisationTeamCount,
result.AppRootOrganisationCount,
result.AppRootUserProjectCount,
result.AppRootTeamCount,
result.AppRootProjectCount,
AppRoot = appRoot,
Organisation = organisation,
Team = team,
Project = project,
UserProject = userProject
};
Store(x => x.Type, FieldStorage.Yes);
Store(x => x.GroupType, FieldStorage.Yes);
Store(x => x.Id, FieldStorage.Yes);
Store(x => x.GroupMemberCount, FieldStorage.Yes);
Store(x => x.TeamProjectCount, FieldStorage.Yes);
Store(x => x.OrganisationTeamCount, FieldStorage.Yes);
Store(x => x.AppRootOrganisationCount, FieldStorage.Yes);
Store(x => x.AppRootUserProjectCount, FieldStorage.Yes);
Store(x => x.AppRootTeamCount, FieldStorage.Yes);
Store(x => x.AppRootProjectCount, FieldStorage.Yes);
}
}
public类所有组:AbstractMultiMapIndexCreationTask
{
公开课成绩
{
公共字符串类型{get;set;}
公共字符串GroupType{get;set;}
公共字符串Id{get;set;}
public int GroupMemberCount{get;set;}
public int TeamProjectCount{get;set;}
公共int组织团队计数{get;set;}
public int approtorganizationcount{get;set;}
public int approtUserProjectCount{get;set;}
public int AppRootTeamCount{get;set;}
public int approtProjectCount{get;set;}
公共组组{get{return AppRoot??Organization??Team??Project??UserProject???(组)null;}
公共批准批准{get;set;}
公共组织{get;set;}
公共团队{get;set;}
公共项目{get;set;}
公共用户项目用户项目{get;set;}
}
公共所有_组()
{
AddMap(Approts=>来自appRoot中的appRoot
选择新的
{
Type=“组”,
GroupType=“approt”,
批准号:,
GroupMemberCount=0,
TeamProjectCount=0,
OrganizationTeamCount=0,
ApproTorOrganizationCount=0,
ApprotUserProjectCount=0,
ApproToTeamCount=0,
ApprotProjectCount=0
});
AddMap(Organizations=>来自Organizations中的Organization
选择新的
{
Type=“组”,
GroupType=“组织”,
机构编号:,
GroupMemberCount=0,
TeamProjectCount=0,
OrganizationTeamCount=0,
ApproTorOrganizationCount=0,
ApprotUserProjectCount=0,
ApproToTeamCount=0,
ApprotProjectCount=0
});
AddMap(团队=>来自团队中的团队
选择新的
{
Type=“组”,
GroupType=“团队”,
团队Id,
GroupMemberCount=0,
TeamProjectCount=0,
OrganizationTeamCount=0,
ApproTorOrganizationCount=0,
ApprotUserProjectCount=0,
ApproToTeamCount=0,
ApprotProjectCount=0
});
AddMap(项目=>来自项目中的项目
选择新的
{
Type=“组”,
GroupType=“项目”,
project.Id,
GroupMemberCount=0,
TeamProjectCount=0,
OrganizationTeamCount=0,
ApproTorOrganizationCount=0,
ApprotUserProjectCount=0,
ApproToTeamCount=0,
ApprotProjectCount=0
});
AddMap(userProjects=>来自userProjects中的userProject
选择新的
{
Type=“组”,
GroupType=“userproject”,
userProject.Id,
GroupMemberCount=0,