Linq Lambda:使用group by和count让最后一个用户使用同一组用户进行更新?

时间:2017-03-17 09:42:17

标签: c# linq lambda

我想使用group by和剩余用户的计数使用linq lambda表达式更新最后一个用户。我不知道怎么能这样做。

这是我的数据:

userid | name | datetime            | isdelete
1      | abc  | 16-03-2017 15:45:59 | 0
1      | abc  | 16-03-2017 12:45:10 | 0 
2      | xyz  | 16-03-2017 15:45:59 | 0
1      | abc  | 16-03-2017 10:40:59 | 0

我希望结果看起来像这样:

userid | name | datetime            | count 
1      | abc  | 16-03-2017 15:45:59 |   3   
2      | xyz  | 16-03-2017 15:45:59 |   1  

此处count的{​​{1}}应为3,因为表格中有三条记录。

我已经写了这个查询,但它正在所有记录。

userid = 1

任何人都知道如何获取我想要的数据?请使用linq lambda表达让我知道。

2 个答案:

答案 0 :(得分:1)

您需要按用户分组,而不是对每个组进行排序,并从每个组中获取

var dataSupertags = {
  div_id: 'supertags',
  jsonData: superTags
};

function drawSupertagsWrapper(dataSupertags) {

  var el = dataSupertags.div_id;
  var data = dataSupertags.jsonData;

  cnt = " * SUPERTAGS DEMO * ";

  cnt += '<section id="main_carousel1" class="section_style_1 carousel1">';
  cnt += '<div class="carousel1_content">';
  cnt += '<div class="posts" id="carousel1_1" style="visibility:visible;">';
  cnt += '<div class="wrapper" id="' + el + '_wrapper">';
  cnt += '</div>';
  cnt += '</div>';
  cnt += '<div class="carouselNext carouselButton" onclick="carousel1_1.next()"></div>' + '<div class="carouselPrev carouselButton" onclick="carousel1_1.prev()"></div>';
  cnt += '</div>';
  cnt += '</section>';

  document.getElementById(el).innerHTML = cnt;
}

function drawSupertagsItems(dataSupertags) {
    var el = dataSupertags.div_id + '_wrapper';
    var data = dataSupertags.jsonData;
    document.getElementById(el).innerHTML = '';
    for (i = 0; i < data.length; i++) {
    jQuery.ajax({
      dataType: 'json',
      url: 'APIURL',
      data: {
        count: 5,
        ret_fields: [
          'props.title__AS__title',
          'props.comentCount__AS__cc',
          'fb_shares',
          'props.pubfromdate_local__AS__pubdate',
          'props.href__AS__href',
          "props.media[indexof(x.type='media' for x in props.media)].otheralternate.300x200.href__AS__thumb",
        ].join(','),
        type: 'type1,type2,type3',
        tag_slugs: data[i].topics[0].slug,
        order: 'pubfromdate-'
      },
      success: function(response) {
        var postData = '';
        postData += '<div class="swipe_item">';
        postData += '<header class="swipe_list">';
        postData += '<h1 class="active">' + '<a href="http://test.com/' + data[i].titleurl + '">' + data[i].title + '</a>' + '</h1>';
        postData += '</header>';
        for (f = 0; response.result.length > 0; f++) {
          postData += '<div class="post">';
          postData += '<a href="' + response.result[f].href + '" class="img" style="background-image:url("' + response.result[f].thumb + '")"></a>';
          postData += '<div class="desc">';
          postData += '<h2><a href="#">' + response.result[f].title + ' <span>' + response.result[f].fb_shares + '</span></a></h2>';
          postData += '</div>';
          postData += '</div>';
        }
        postData += '</div>';
        document.getElementById(el).appendChild(postData);
      }
    });
  }
}

答案 1 :(得分:1)

您忘了对数据进行分组:

var result = db.Users.Where(a => !a.isdelete)
    .GroupBy(x => x.userid)
    .Select(x => new User 
        { 
            userid = x.Key, 
            name = x.Last().Name, 
            datetime = x.OrderByDescending(a => a.datetime).First().datetime, 
            count = x.Count() 
        });

编辑:考虑到性能,这可能不是最佳的,因为对LastOrderByAscending的调用都将迭代整个数据。为了克服这个问题,您可以稍微重新构造一下这个查询:

var result = db.Users.Where(a => !a.isdelete)
    .GroupBy(x => x.userid)
    .Select(x => new 
        { 
            user = x.OrderByDescending(a => a.datetime).First(), 
            count = x.Count() 
        })
    .Select(x => new User {
        name = x.user.name,
        userid = x.user.userid,
        datetime = x.user.datetime,
        count = x.count
    });