Ben*_*aum 5 c# linq linq-to-entities entity-framework
为清楚起见,按照建议将问题总结在一行中:
假设我有一张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
Run Code Online (Sandbox Code Playgroud)
任何有意义的方式来表明有问题的对是:
2008-11-11 1
2008-11-12 0
Run Code Online (Sandbox Code Playgroud)
(因一天不同类型而不同)
和
2008-12-13 0
2008-12-15 1
Run Code Online (Sandbox Code Playgroud)
(因两天不同类型而不同)
这是我找到的相关 SQL 解决方案。
我不完全理解您要解决的问题,因此以下仅是一般建议。听起来好像任何两个“时间相邻”且彼此相隔一周之内的用户注册都是规则,但这听起来有点奇怪。
每当您想要查询仅间接可用的信息(即不是简单的列值)时,请使用投影来选择解决问题所需的信息。
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 )
};
Run Code Online (Sandbox Code Playgroud)
一旦您拥有更易于访问的格式的数据,编写查询来解决业务问题就会变得更加容易。
var duplicates = (from d in query
where d.IsDuplicate && d.SignUpDaysApart.TotalDays <= 7
select d).ToList();
Run Code Online (Sandbox Code Playgroud)
我希望以上内容足以启发您找到解决方案。
| 归档时间: |
|
| 查看次数: |
714 次 |
| 最近记录: |