使用Linq查找符合这些条件的所有行

  • 本文关键字:条件 Linq 查找 使用 c# linq
  • 更新时间 :
  • 英文 :

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();

我没有对此进行测试,所以预计会出现一些错误。我希望能给你一个解决这个问题的办法。

祝你好运。

最新更新