获取以下实体之间的差异
本文关键字:之间 实体 获取 | 更新日期: 2023-09-27 18:17:31
按照建议用一行话总结问题:
我想找到所有的东西,有不同的值为一些字段,相隔不到一周(基于另一个字段)
假设我有一个Users
表和一个User
类。
每个User
包含如下字段:
-
SignUpDate
a非空DateTime
字段 -
UserType
一个int字段,对于这个问题我们设它是1
或0
我想选择注册间隔少于7天且具有不同用户类型的所有用户对。
我目前的(悲惨的)尝试包括OrderBy(r=>r.SignUpDate)
和.ToList
,这不是什么大问题,因为每两周的用户数量并不多。(我从重叠的周中抓取了所有用户并比较了数据)
然而,我发现我目前的解决方案相当差。我不知道怎么做才是正确的。
我认为这里的核心问题是我不知道如何解决"选择每两个对应的记录"在LINQ实体排序后的概念。
非常感谢任何帮助,我很感兴趣的是如何解决这类问题,而不是在未来开始我自己的问题。
输入例子 SignUpDate UserType
------------------------------------
2008-11-11 1
2008-11-12 0
2008-11-13 0
2008-12-13 0
2008-12-15 1
示例输出
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
(不同天数不同类型)
我不完全明白您要解决的是什么问题,所以以下只是一般的建议。这听起来就像任何两个用户注册"在时间上相邻"并且在一周内彼此是规则,但这听起来有点奇怪。
每当您想查询一条只能间接获得的信息(即,不是简单的列值)时,请使用投影来选择解决问题所需的信息。
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();
我希望以上的内容能给你足够的启发,让你找到一个解决方案
想到了这样的东西
private bool LessThan7DaysApart(DateTime d1, DateTime d2)
{
return (d1 - d2).Duration() < new TimeSpan(7, 0, 0, 0);
}
private void Match()
{
List<User> listfortype0 = users.Where(u => u.UserType == 0).ToList();
List<User> listfortype1 = users.Where(u => u.UserType == 1).ToList();
foreach (User u in listfortype0)
{
List<User> tmp = listfortype1.Where(u2 => LessThan7DaysApart(u2.SignUpDate, u2.SignUpDate)).ToList();
if (tmp.Count > 0)
{
List<User> matchedusers = new List<User> { u, tmp[0] };
listfortype1.Remove(tmp[0]);
}
}
}