c# - 获取以下实体之间的差异 Linq to Entities

标签 c# linq entity-framework linq-to-entities

为了清楚起见,按照建议在一行中总结问题:

我想找到对某些字段具有不同值且相隔不到一周(基于另一个字段)的所有事物


假设我有一个 Users 表和一个 User 类。

每个 User 都有以下字段:

  • SignUpDate 一个非空的 DateTime 字段
  • UserType 一个 int 字段,对于这个问题,假设它是 10

我想选择所有注册时间少于 7 天且具有不同用户类型的用户对。

我当前(悲惨的)尝试包括一个 OrderBy(r=>r.SignUpDate) 和一个 .ToList 这不是什么大问题,因为用户数量每2周一次量不大。 (我抓取了所有重叠周的用户并比较了数据)。

但是,我发现我当前的解决方案很差。我不知道处理这个问题的正确方法是什么。

我认为这里的核心问题是我不知道如何在 LINQ to Entities 中解决“选择每两个相应记录”的概念

非常感谢任何帮助,我对如何在未来不开始自己的问题的情况下解决这类问题很感兴趣。

示例输入

 SignUpDate        UserType
 ------------------------------------
 2008-11-11          1
 2008-11-12          0
 2008-11-13          0
 2008-12-13          0
 2008-12-15          1

示例输出

表明有问题的对的任何有意义的方式是:

 2008-11-11          1
 2008-11-12          0

(每天不同,类型不同)

 2008-12-13          0
 2008-12-15          1

(相差两天,类型不同)


这是我找到的一个 related SQL solution

最佳答案

我不完全明白你要解决什么问题,所以以下只是一般性的建议。听起来任何两个“在时间上相邻”且彼此相距一周以内的用户注册都是规则,但这听起来有点奇怪..

每当你想查询一条只能间接可用的信息(即不是简单的列值的东西)时,使用投影来选择你需要解决问题的信息。

var query = from user in context.Users
            let previousUser = context.Users
                .Where( u => u.SignUpDate < user.SignUpDate )
                .OrderBy( u => u.SignUpDate )
                .FirstOrDefault()
            select new
            {
                User = user,
                PreviousUser = previousUser,
                IsDuplicate = previousUser != null && previousUser.UserType != user.UserType,
                SignUpDaysApart = user.SignUpDate.Subtract( previousUser.SignUpDate )
            };

一旦您拥有更易于访问的格式的数据,编写解决业务问题的查询就会变得容易得多。

var duplicates = (from d in query
                 where d.IsDuplicate && d.SignUpDaysApart.TotalDays <= 7
                 select d).ToList();

希望以上内容能给您带来足够的灵感,让您找到解决方案。

关于c# - 获取以下实体之间的差异 Linq to Entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17015037/

相关文章:

c# - 使用 StartsWith 将值与字符串数组进行比较

c# - 为什么 Linq Cast<> 助手不能与隐式转换运算符一起使用?

c# - Dapper 无法从 SELECT CASE 查询中找到 POCO 映射

c# - 在 ASP.NET MVC 5 Controller 中使用 POST 从 dotnet Core Web API 下载文件

c# - 将 System.Drawing.Color 转换为 RGB 和十六进制值

linq - 使用 linq 将 list<long> 转换为 list<int> 的最简单方法是什么?

c# - 列出内部 IQueryable 对象

c# - EF ctx.Object.Select 和 obj.Select 之间的区别

c# - 在导航属性上定义数据注释

c# - 如何将列表绑定(bind)到dataGridView?