匹配特定日期的所有门票

时间:2014-09-08 15:39:02

标签: c# linq asp.net-mvc-4

此处的问题的延续: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很新,所以请解释一下您的解决方案的语法。谢谢你的帮助!

2 个答案:

答案 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),但这也取决于其他因素。所以这取决于你。