Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询biz对象以发现唯一记录..这是递归的情况吗_C#_C# 4.0_Linq To Objects - Fatal编程技术网

C# Linq查询biz对象以发现唯一记录..这是递归的情况吗

C# Linq查询biz对象以发现唯一记录..这是递归的情况吗,c#,c#-4.0,linq-to-objects,C#,C# 4.0,Linq To Objects,我不知道该怎么做,希望这里的智囊团能给我指明正确的方向。我有一个biz对象,它是一个集合,当然顶级集合中的每个项都有一些属性,但其中一个属性是一些相关子记录的集合……正是这些子记录具有我要查找的值 因此,这是一个高层次的概述,并没有靠近 父对象是事件的集合(本质上是学校课堂),相关的子对象是讲师…如小学、中学、助手、观察员…等 现在的想法是创建一个讲师日历,显示Bob..etc当月的活动 因此,讲师将位于日历的左侧(Y轴),而月份的日期将位于顶部(X轴)……然而,正如我提到的,讲师必须从biz

我不知道该怎么做,希望这里的智囊团能给我指明正确的方向。我有一个biz对象,它是一个集合,当然顶级集合中的每个项都有一些属性,但其中一个属性是一些相关子记录的集合……正是这些子记录具有我要查找的值

因此,这是一个高层次的概述,并没有靠近

父对象是事件的集合(本质上是学校课堂),相关的子对象是讲师…如小学、中学、助手、观察员…等

现在的想法是创建一个讲师日历,显示Bob..etc当月的活动

因此,讲师将位于日历的左侧(Y轴),而月份的日期将位于顶部(X轴)……然而,正如我提到的,讲师必须从biz obj中挖掘出来

现在我正处于开发阶段,如果有更好的方法可以实现的话,我可以修改这个业务对象


现在,在我有限的知识库中,我能想到的最好方法是编写一个foreach循环,以提取每次查询一个的讲师…将结果添加到另一个集合,然后获取新集合并删除重复或重复检查,并且在循环期间不插入

类似List.ForEach(x=>x.TeamMember…?)

父对象:

public class CalendarEvent
{
    #region Internal Fields

        private readonly string _id;
        private DateTime _start;
        private DateTime _end;
        private string _eventname;

        private TeamMembers _eventteam;

    #endregion

    #region Const

        public CalendarEvent(string id, DateTime start, DateTime end, string evtname)
        {
            this._id = id;
            this._start = start;
            this._end = end;
            this._eventname = evtname;
        }

    #endregion

    #region Props

        public string ID { get { return _id; } }
        public DateTime Start { get { return _start; } }
        public DateTime End { get { return _end; } }
        public string EventName { get { return _eventname; } }

        public TeamMembers EventTeamMembers { get; set; }



    #endregion

}
子对象组成员:

public class TeamMember
{
    #region Internal Fields

        private readonly string _firstname;
        private readonly string _fullname;
        private readonly string _userid;

        private TeamRoles.TeamMemberRole _memberrole;

        //private string _resid;

    #endregion

    #region Const

        public TeamMember(string fullname, string firstname, string userid)
        {
            this._fullname = fullname;
            this._firstname = firstname;
            this._userid = userid;
            //this._resid = resid;
        }

    #endregion

    #region Props

        public string FirstName { get { return _firstname; } }
        public string FullName { get { return _fullname; } }
        public string UserId { get { return _userid; } }
        //public string SpeakerID { get { return _resid; } }

        public TeamRoles.TeamMemberRole TeamMemberRole { get; set; }

    #endregion

}
因此,对象将如下所示:

CalendarEvent.Count = 25

CalendarEvent[0]
   EventId = GUID
   Start = May 1st
   End = May 12th
   EventName = Pencil Sharpening
   TeamMembers(.count = 3)
public IEnumerable<CalendarEvent> EventsForTeamMember(string userId)
{
    return _allEvents.Where(e => e.EventTeamMembers.Any(tm => tm.UserId == userId));
}
因此,我需要提取所有三个团队成员,但是..如果我已经将他们添加到Y轴集合(即将绑定到Y轴的集合),请稍后使用List.Distinct()或similiar跳过或删除

如果您有任何想法、建议或最佳实践,我们将不胜感激


我很抱歉,但我正在努力解决向我展示的一个方面。我敢肯定@Ben Aaronson已经回答了这个问题,但这已经超出了我的理解范围

我理解Event知道的关于团队成员的评论,但不是相反。我也理解这一说法:

“您需要将所有事件存储在某个位置。您不能仅从团队成员开始,在没有同时访问事件的权限的情况下获取事件…”

同意,但我确实有这样一个集合,在下面提议的名为_allevents的解决方案中开始……所以我希望能拿出一个独特的团队成员集合

例如,我写了这篇文章,但我缺乏知识意味着这只是一次桑树之旅……我得到了我已经拥有的东西

List<CalendarEvent> asdf = _allevents.Where(evt => evt.TeamMembers.Any(tm => tm.UserId != string.Empty)).Distinct().ToList();
List asdf=\u allevents.Where(evt=>evt.TeamMembers.Any(tm=>tm.UserId!=string.Empty)).Distinct().ToList();

您的解决方案如下所示:

CalendarEvent.Count = 25

CalendarEvent[0]
   EventId = GUID
   Start = May 1st
   End = May 12th
   EventName = Pencil Sharpening
   TeamMembers(.count = 3)
public IEnumerable<CalendarEvent> EventsForTeamMember(string userId)
{
    return _allEvents.Where(e => e.EventTeamMembers.Any(tm => tm.UserId == userId));
}

这里的关键点是
SelectMany
,它将集合展平。

我将迭代对象,使用
SelectMany
收集一个新的匿名对象和团队成员和日期,然后将这些元素“展平”并连接起来——然后按团队成员和日期排序。一旦您按照团队成员和日期对列表进行了排序,您就可以在列表上进行迭代以构建您的日历,因为项目将按照所需的顺序排列

像这样:

var byMemberDate = events
                    .SelectMany(e => e.EventTeamMembers
                                      .Select(m => new { evnt = e, member = m}))
                    .OrderBy(item => item.member.FullName)
                    .ThenBy(item => item.evnt.Start);

foreach(var item in byMemberDate)
  Console.WriteLine("Member = "+item.member.FullName+" Date = "+item.evnt.Start);
var byMembers = events
                .SelectMany(e => e.EventTeamMembers
                                  .Select(m => new { start = e.Start, name = m.FullName}))
                .GroupBy(item => item.name)
                .OrderBy(g => g.Key);
输出:

Member = gi joe Date = 1/1/2014 1:01:01 AM
Member = hogan long Date = 1/1/2014 1:01:01 AM
Member = sam spade Date = 1/1/2014 1:01:01 AM
Member = sam spade Date = 2/2/2014 2:02:02 AM
Member = three three Date = 3/3/2014 3:03:03 AM
完整的工作代码在这里


我想到了一个旁注。如果您想要一个团队成员列表,每个成员都有一个日期列表,这也很简单。只需在
选择many之后使用
GroupBy

像这样:

var byMemberDate = events
                    .SelectMany(e => e.EventTeamMembers
                                      .Select(m => new { evnt = e, member = m}))
                    .OrderBy(item => item.member.FullName)
                    .ThenBy(item => item.evnt.Start);

foreach(var item in byMemberDate)
  Console.WriteLine("Member = "+item.member.FullName+" Date = "+item.evnt.Start);
var byMembers = events
                .SelectMany(e => e.EventTeamMembers
                                  .Select(m => new { start = e.Start, name = m.FullName}))
                .GroupBy(item => item.name)
                .OrderBy(g => g.Key);

顺便问一下,您是否知道语法
get;私人设置用于属性?在你的例子中可以删去很多不必要的代码我回答了,但是现在我重新阅读了这个问题,我不确定它是否完全满足了你的要求。你到底需要什么?好吧,根据你的解决方案,我也许能到达那里。我不想投射allevents…而是“allTeamMembers”…而且我的IEnumerable应该是IEnumerable,我会用词来称呼smith…既然这么说了,做我的家庭作业不是你的工作,从我可以告诉你的是,你给了我一个非常有帮助的提升,在正确的方向上。你没有定义
TeamMembers
类型。“我不想投射allevents…而是“allTeamMembers”“您需要将所有事件存储在某个位置。您不能仅从团队成员开始,在没有同时访问事件的情况下获取事件。非常感谢您的耐心。这是我没有连接的信息。