首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除每种类型实体框架的前10名以外的所有

删除每种类型实体框架的前10名以外的所有
EN

Stack Overflow用户
提问于 2016-01-27 22:50:18
回答 2查看 1K关注 0票数 1

假设我有一张桌子,像:

代码语言:javascript
复制
Id    Name   Category   CreatedDate
1     test   test       10-10-2015
2     test1  test1      10-10-2015
...

现在,我想删除所有行,只保留所有类别中的前10行(按createdDate的说法,前10位是指最新的10行)。

使用原始SQL,如下所示:

代码语言:javascript
复制
DELETE FROM [Product]
WHERE id NOT IN
(
    SELECT id FROM
    (
        SELECT id, RANK() OVER(PARTITION BY Category ORDER BY createdDate DESC) num
        FROM [Product]
    ) X
WHERE num <= 10

在实体框架中使用DbContext时,是如何做到这一点的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-27 23:00:08

代码语言:javascript
复制
// GET all products
var list = ctx.Products.ToList();

// GROUP by category, ORDER by date descending, SKIP 10 rows by category
var groupByListToRemove = list.GroupBy(x => x.Category)
                              .Select(x => x.OrderByDescending(y => y.CreatedDate)
                                            .Skip(10).ToList());

// SELECT all data to remove
var listToRemove = groupByListToRemove.SelectMany(x => x);

// Have fun!
ctx.Products.RemoveRange(listToRemove);
票数 3
EN

Stack Overflow用户

发布于 2016-01-27 22:55:14

如果你有很多数据的话。

代码语言:javascript
复制
var oldItems = efContext.Products
.GroupBy(x => x.Category, 
(c,p) => p.OrderByDescending(x => p.createdDate).Skip(10))
.SelectMany(p => p);
efContext.Products.RemoveRange(oldItems);

(用记事本写)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35049653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档