2014-09-08 3 views
0

продолжение вопроса здесь: 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 выше соответствует номерам билетов на все время. Я хочу получить матчи всего за один день. Весь день. Поэтому для этого нам нужно включить предложение where, которое проверяет атрибут AddDateTime.

public int CountPartialMatchingTicket(IList<int> numbers, DateTime day) { 

} 

Я очень новичок в Linq, поэтому, пожалуйста, объясните синтаксис вашего решения. Спасибо за помощь!

ответ

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), но это зависит и от других факторов. Так что это зависит от вас.

+0

Сравнение свойства DateTime также сравнивает время, которое не задавал вопрос. Изменить: вы отредактировали, чтобы добавить свойство DateTime.Date, которое не будет работать для EntityFramework (мое предположение из-за ссылки db). – mfanto

+0

@mfanto, я упомянул, что ему, возможно, придется проверять другие свойства, я оставил его, потому что я не хотел загромождать код. –

+0

Спасибо за этот ответ! .Date не в Linq ... поэтому в конце я использую: Where (tk => tk.PlayDateTime.Year == DateRule.Year && tk.PlayDateTime.Month == DateRule.Month && tk.PlayDateTime.Day == DateRule.День) –

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 появляется в массиве цифр.

+0

Я использую EF, хотя DBFunctions, кажется, не определен для меня? –

+0

Используя второе решение, которое вы предоставили мне, я получаю эту ошибку при запуске страницы: указанный тип member 'Date' не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности. –

+0

Я использую EntityFramework 5.0.0, если это помогает! –