Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取以下实体之间的差异Linq到实体_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 获取以下实体之间的差异Linq到实体

C# 获取以下实体之间的差异Linq到实体,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,将问题总结在一行中,以明确建议: 我想找到所有对某个字段具有不同值且相隔不到一周的内容(基于另一个字段) 假设我有一个Users表和一个User类 每个用户都有以下字段: SignUpDate非空DateTime字段 UserType一个int字段,对于这个问题,假设它是1或0 我想选择所有相隔不到7天注册并且拥有不同用户类型的用户对 我目前(痛苦的)尝试包括一个OrderBy(r=>r.SignUpDate)和一个.ToList,这没什么大不了的,因为每两周的用户数量不多。(我从重叠的几

将问题总结在一行中,以明确建议:

我想找到所有对某个字段具有不同值且相隔不到一周的内容(基于另一个字段)
假设我有一个
Users
表和一个
User

每个
用户
都有以下字段:

  • SignUpDate
    非空
    DateTime
    字段
  • UserType
    一个int字段,对于这个问题,假设它是
    1
    0
我想选择所有相隔不到7天注册并且拥有不同用户类型的用户对

我目前(痛苦的)尝试包括一个
OrderBy(r=>r.SignUpDate)
和一个
.ToList
,这没什么大不了的,因为每两周的用户数量不多。(我从重叠的几周中抓取了所有用户,并比较了数据)

然而,我发现我目前的解决方案相当糟糕。我不知道正确的方法是什么

我认为这里的核心问题是,我不知道如何解决在LINQ中“每两个对应记录选择一次”的概念,即实体排序后,

非常感谢任何帮助,我感兴趣的是我如何能够解决这类问题,而不必在将来开始我自己的问题

示例输入 示例输出 任何有意义的方式表明问题对是:

 2008-11-11          1
 2008-11-12          0
(每天不同,类型不同)

(两天不同,类型不同)



这是我找到的一本书。

想到了这样的东西

        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]);
                }
            }
        }
private bool lessthan 7daysapart(日期时间d1,日期时间d2)
{
return(d1-d2).Duration()<新的时间跨度(7,0,0,0);
}
私有无效匹配()
{
列出listfortype0=users.Where(u=>u.UserType==0.ToList();
列出listfortype1=users.Where(u=>u.UserType==1.ToList();
foreach(listfortype0中的用户u)
{
List tmp=listfortype1.Where(u2=>LessThan7DaysApart(u2.SignUpDate,u2.SignUpDate)).ToList();
如果(tmp.Count>0)
{
列表匹配用户=新列表{u,tmp[0]};
listfortype1.Remove(tmp[0]);
}
}
}

我不完全理解您试图解决的问题,因此以下仅为一般性建议。这听起来像是任何两个“时间相邻”且彼此间隔不超过一周的用户注册是规则,但听起来有点奇怪

当您想要查询仅间接可用的信息时(即不是简单的列值),请使用投影选择解决问题所需的信息

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 query=来自上下文中的用户。用户
让previousUser=context.Users
.Where(u=>u.SignUpDateu.SignUpDate)
.FirstOrDefault()
选择新的
{
用户=用户,
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();
var duplicates=(来自查询中的d

如果d.IsDuplicate&&d.SignUpDaysApart.TotalDays只是为了让您开始,这可能会有所帮助:@RussC感谢LINQ to Entities似乎能够执行
DateTime.Subtract
,我的问题是“查找对某些字段具有不同值且相隔不到一周的所有内容”。我会澄清的。欢迎来到StackOverflow!感谢您尝试帮助我回答我的问题。。当您执行ToList()时您正在从数据库中提取所有数据并将其转换为对象。查询这些对象将非常昂贵且不实用。Linq to Entities将您的代码映射到SQL,并在数据库上运行。建议的解决方案实际上比我当前使用的方法慢,而且不满意。不过,感谢您的努力。您不需要.Duration()来创建timespan对象,这是DateTime上-operator的正常输出。此外,与每次求值时创建7天的新timespan对象不同(非常昂贵),只需比较所创建timespan的.days属性。通过这两个更改,您可以使用
return(d1-d2).Days<7;
谢谢,这看起来像我正在寻找的,有没有办法用lambda表达式语法执行查询语法(让
部分)呢?(可能是
选择介于两者之间?)只是想知道。是的,LINQ查询语法只是扩展方法之上的编译器糖。不确定您会使用什么方法,抱歉:)供参考
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();