none
如何简化Linq 语句中的select new {......} RRS feed

  • 问题

  • 我的数据访问类中有很多类似这样的语句:
    var status2 = from s in edm.Statuses
                  where s.Users.Id == userId
                  join u in edm.Users on s.Users.Id equals u.Id
                  select new
                  {
                      CreatedAt = s.CreatedAt,
                      Favorited = s.Favorited,
                      Id = s.Id,
                      InReplyToScreenName = s.InReplyToScreenName,
                      InReplyToStatusID = s.InReplyToStatusID,
                      InReplyToUserID = s.InReplyToUserID,
                      Source = s.Source,
                      Text = s.Text,
                      Truncated = s.Truncated,
                      UserId = u.Id,
                      Username = u.Name
                  };
    这句 select new { ...... } 出现了好几次,如何将其分离到一个单独的方法中?请教各位

    2009年7月16日 1:36

答案

  • select new { ...... }是Linq单句语法中的一部分,我想不能再分了。
    是不是可以考虑将整句var status2= from...select new { ...... };重构为一个方法。

    2009年7月16日 2:18

全部回复

  • select new { ...... }是Linq单句语法中的一部分,我想不能再分了。
    是不是可以考虑将整句var status2= from...select new { ...... };重构为一个方法。

    2009年7月16日 2:18
  • 这个方法在 数据访问层的一个类中,这个方法里有 select new { ...... },此类的其他方法里也有相同的select new { ...... },好几个方法都有这个select new { ...... },我想将select new { ...... }简化到一个方法中,实现类似这个的效果:
    var status2 = from s in edm.Statuses
                  where s.Users.Id == userId
                  join u in edm.Users on s.Users.Id equals u.Id
                  select { return CreateStatus(s, u); }

    这样很多方法遇到 select new { ...... },就简化为 select { return CreateStatus(s, u); },
    但发现不行,

    但我找到了一个方法,修改上面的语句
    var status1 = edm.Statuses
    .Where(s => s.Users.Id == userId)
    .Join(edm.Users, s => s.Users.Id, u => u.Id, 
    (s, u)=> new Statuses
    {
    CreatedAt = s.CreatedAt,
            Favorited = s.Favorited,
            Id = s.Id,
            InReplyToScreenName = s.InReplyToScreenName,
            ......
    })
    .Take(5); (上面的方法忘记这个Take(5)了,实际应用中有这个个Take(5))


    再进一步修改为:
    var status1 = edm.Statuses
    .Where(s => s.Users.Id == userId)
    .Join(edm.Users, s => s.Users.Id, u => u.Id, Select())
    .Take(4);

    上面粗体部分替换成了Select()方法,此方法返回一个 Func<TOutter, TInner, TResult>委托,从而使select new { ...... }得到了简化。

    2009年7月16日 2:57
  • Wonderful :)
    学习了。
    如果Where条件等需要相对稳定的话,将来还可以为Select()应用策略模式,以适应个性化的需求。
    2009年7月16日 3:46
  • 非常感谢关注
    2009年7月17日 0:57