var mEstList = new List<Estimate>();
var mDatesList = new List<DateTime>("2020-03-01", "2020-03-02", "2020-03-03");
var namesList = new List<string>("Name1", "Name2", "Name3");
Estimates Table Example:
ID Name Estimate Date
1 Name1 50 2020-03-01
2 Name1 55 2020-03-02
3 Name1 54 2020-03-03
4 Name2 43 2020-03-03
5 Name3 43 2020-03-01
6 Name3 42 2020-03-02
7 Name3 44 2020-03-03
这是我在不使用linq的情况下尝试做的事情,但我正在试图找出如何使用单个linq命令来做同样的事情。我试图只返回与上面的主日期列表匹配的所有日期的估计,所以在我的示例中,我将返回除第4行之外的所有行
for (int h = 0; h < namesList.Count; h++)
{
string name = namesList.ElementAt(h);
var estList = context.Estimates.Where(x => x.Name == name && x.Date >= 2020-03-01);
if (estList.Count > 0)
{
var finalDate = estList.Max(x => x.Date);
var sDateList = mDatesList.Where(x => x.Date <= finalDate);
if (estList.Count == sDateList.Count)
{
mEstList.AddRange(estList);
}
}
}
更新:这是我到目前为止的代码,看起来是正确的,但我得到的日期在Linq到实体异常中不受支持,即使我在Linq代码中转换了日期。我被卡住了。有什么建议吗?
var mEstList = await context.Estimates.GroupBy(e => e.Name).Where(g => mDatesList.Where(x => x.Date <= DbFunctions.TruncateTime(g.Max(n => n.Date))).
All(d => g.Select(e => e.Date).Contains(d))).SelectMany(g => g).ToListAsync().ConfigureAwait(false);
我会做一些类似的事情:
mEstList = context.Estimates.GroupBy(e => e.Name).Where(g => mDatesList.All(d => g.values.Select(e => e.Date).Contains(d))).SelectMany(g => g.values).ToList();
我没有对此进行测试,所以预计会出现一些错误。我希望能给你一个解决这个问题的办法。
祝你好运。