Asp.net mvc 检查用户是否使用实体框架提交每日用户

Asp.net mvc 检查用户是否使用实体框架提交每日用户,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我已经设置了以下场景,需要返回当天未提交条目的用户 下面是正在使用的示例数据 var entries = new List<Entry> { new Entry { UserId = "fce465f6-089d-4416-a631-7b8201c759d6", Name = "Bugs Bunny", Email = "bugs@bunny.com", CreatedDate = DateTime.Now.AddDays(-1) }, new Entry { Use

我已经设置了以下场景,需要返回当天未提交条目的用户

下面是正在使用的示例数据

var entries = new List<Entry> {
    new Entry { UserId = "fce465f6-089d-4416-a631-7b8201c759d6", Name = "Bugs Bunny", Email = "bugs@bunny.com", CreatedDate = DateTime.Now.AddDays(-1) },
    new Entry { UserId = "1b77f86a-4aad-4788-aa0c-791a7b734181", Name = "Daffy Duck", Email = "daffy@duck.com", CreatedDate = DateTime.Now.AddDays(-1) },
    new Entry { UserId = "b293bc9d-7626-4c66-888b-e45daebf8322", Name = "Yosemite Sam", Email = "yosemite@sam.com", CreatedDate = DateTime.Now.AddDays(-1) }
    new Entry { UserId = "ff8321fa-b241-456a-b618-826fdd75aaf2", Name = "Pepe Le Pew", Email = "pepe@lepew.com", CreatedDate = DateTime.Now.AddDays(-1) },

    new Entry { UserId = "fce465f6-089d-4416-a631-7b8201c759d6", Name = "Bugs Bunny", Email = "bugs@bunny.com", CreatedDate = DateTime.Now.AddDays(0) },
    new Entry { UserId = "1b77f86a-4aad-4788-aa0c-791a7b734181", Name = "Daffy Duck", Email = "daffy@duck.com", CreatedDate = DateTime.Now.AddDays(0) },
    new Entry { UserId = "b293bc9d-7626-4c66-888b-e45daebf8322", Name = "Yosemite Sam", Email = "yosemite@sam.com", CreatedDate = DateTime.Now.AddDays(0) }
};
entries.ForEach(e => context.Entries.Add(e));
context.SaveChanges();
var条目=新列表{
新条目{UserId=“fce465f6-089d-4416-a631-7b8201c759d6”,Name=“Bugs Bunny”,电子邮件=”bugs@bunny.com,CreatedDate=DateTime.Now.AddDays(-1)},
新条目{UserId=“1b77f86a-4aad-4788-aa0c-791a7b734181”,Name=“Daffy Duck”,Email=”daffy@duck.com,CreatedDate=DateTime.Now.AddDays(-1)},
新条目{UserId=“b293bc9d-7626-4c66-888b-e45daebf8322”,Name=“Yosemite Sam”,电子邮件=”yosemite@sam.com,CreatedDate=DateTime.Now.AddDays(-1)}
新条目{UserId=“ff8321fa-b241-456a-b618-826fdd75aaf2”,Name=“Pepe Le Pew”,Email=”pepe@lepew.com,CreatedDate=DateTime.Now.AddDays(-1)},
新条目{UserId=“fce465f6-089d-4416-a631-7b8201c759d6”,Name=“Bugs Bunny”,电子邮件=”bugs@bunny.com,CreatedDate=DateTime.Now.AddDays(0)},
新条目{UserId=“1b77f86a-4aad-4788-aa0c-791a7b734181”,Name=“Daffy Duck”,Email=”daffy@duck.com,CreatedDate=DateTime.Now.AddDays(0)},
新条目{UserId=“b293bc9d-7626-4c66-888b-e45daebf8322”,Name=“Yosemite Sam”,电子邮件=”yosemite@sam.com,CreatedDate=DateTime.Now.AddDays(0)}
};
entries.ForEach(e=>context.entries.Add(e));
SaveChanges();
在本例中,我希望返回一条记录,因为当天没有Pepe Le Pew的条目

我正在使用下面的片段,但我正在努力理解Where语句

var entries = db.Entries
    .GroupBy(e => e.UserId)
    .Select(g => g.OrderByDescending(e => e.CreatedDate)
        .Where(e =>
            DbFunctions.TruncateTime(e.CreatedDate) < currentDay.Date
            && DbFunctions.TruncateTime(e.CreatedDate) != currentDay.Date)
        .FirstOrDefault())
    .ToList();
var entries=db.entries
.GroupBy(e=>e.UserId)
.Select(g=>g.OrderByDescending(e=>e.CreatedDate)
。其中(e=>
DbFunctions.TruncateTime(e.CreatedDate)
有什么想法吗

更新

由于以下解决方案,大量归功于@DavidG

var entries = db.Entries
    .Where(e => DbFunctions.TruncateTime(e.CreatedDate) < currentDay.Date)
    .Select(e => e.UserId)
    .Except(db.Entries.Where(e => DbFunctions.TruncateTime(e.CreatedDate) == currentDay.Date).Select(e => e.UserId))
    .ToList();
var entries=db.entries
.Where(e=>DbFunctions.TruncateTime(e.CreatedDate)e.UserId)
.Except(db.Entries.Where(e=>DbFunctions.TruncateTime(e.CreatedDate)==currentDay.Date)。选择(e=>e.UserId))
.ToList();

您需要从所有唯一用户的列表开始,例如:

var allUsers = entries
    .GroupBy(u => new { u.UserId })
    .Select(u => new u.Key.UserId);
然后,您有一个查询来获取今天已提交条目的所有用户:

var entriesToday = db.Entries
    .Where(e => DbFunctions.TruncateTime(e.CreatedDate) == currentDay.Date)
    .GroupBy(e => e.UserId)
    .Select(g => g.Key);
现在,通过进行一个大查询来组合它们:

var entries = db.Entries
    .GroupBy(u => new { u.UserId })
    .Select(u => u.Key.UserId)
    .Except(db.Entries
                .Where(e => DbFunctions.TruncateTime(e.CreatedDate) == currentDay.Date)
                .GroupBy(e => e.UserId)
                .Select(g => g.Key);
或者因为这将使用延迟执行,您可以通过使用前两个查询的结果来简化它:

var entries = allUsers.Except(entriesToday);

啊!这也会返回4条记录。你也有用户列表吗?到目前为止,我只有一个Entries表。如果需要,我可以添加一个Users表。尝试此编辑,没有要测试的db,但应该可以工作。在上获取以下错误。Except('System.Linq.IQueryable'不包含'Except'的定义和最佳扩展方法重载'System.Linq.ParallelEnumerable.Except(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable)'有一些无效的参数