此处的问题的延续:How to write dynamic Linq to count matching numbers
我在这里有两张表,我正在查询匹配的数字。一张票有很多票号。
Ticket:
TicketId, Name, AddDateTime
TicketNumbers:
Id, TicketId, Number
目前我有这个功能可以获得我想要的匹配数。这对我来说非常神秘 - 我不知道有人会用简单的英语读出这个Linq。
public int CountPartialMatchingTicket(IList<int> numbers)
{
var arr = numbers.ToArray();
int count = db.Tickets.Count(
tk=>arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)));
return count;
}
但是,上面的Linq始终匹配票号。我想在一天内获得比赛。整整一天。所以要做到这一点,我们需要包含一个检查AddDateTime属性的where子句。
public int CountPartialMatchingTicket(IList<int> numbers, DateTime day) {
}
我对Linq很新,所以请解释一下您的解决方案的语法。谢谢你的帮助!
答案 0 :(得分:3)
您可以将过滤器添加到Count()
方法。要比较一天的日期并忽略时间,您需要使用DateTime.Date属性,或致电DbFunctions.TruncateTime进行EntityFramework。
public int CountPartialMatchingTicket(IList<int> numbers, DateTime day)
{
var arr = numbers.ToArray();
int count = db.Tickets.Count(tk => DbFunctions.TruncateTime(tk.AddDateTime) == DbFunctions.TruncateTime(day) && arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)));
return count;
}
如果您没有使用EF,那么要比较DateTime.Date属性:
public int CountPartialMatchingTicket(IList<int> numbers, DateTime day)
{
var arr = numbers.ToArray();
int count = db.Tickets.Count(tk => tk.AddDateTime.Date == day.Date && arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)));
return count;
}
代码用英文读取,如:
统计所有门票(db.Tickets.Count(...)
),其中AddDateTime
的日期部分与day
的日期部分匹配,TicketNumber.Number
出现在数字数组中。
答案 1 :(得分:1)
int count = db.Tickets.Where(tk=>tk.AddDateTime == day)
.Count(tk=>arr.All(n=> tk.TicketNumbers.Any(tn=>tn.Number== n)));
您可以按day
过滤故障单,然后继续查看现有查询。您可能需要检查日期时间的properties
(例如AddDateTime.Day== day.Day && AddDateTime.Month == day.Month && AddDateTime.Year == day.Year
),但这也取决于其他因素。所以这取决于你。