为了清楚起见,按照建议在一行中总结问题:
我想找到对某些字段具有不同值且相隔不到一周(基于另一个字段)的所有事物
假设我有一个 Users
表和一个 User
类。
每个 User
都有以下字段:
SignUpDate
一个非空的DateTime
字段UserType
一个 int 字段,对于这个问题,假设它是1
或0
我想选择所有注册时间少于 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/