2015-12-17 3 views
0

Пытается создать запрос Linq, который может выполнять несколько запросов в одной команде вместо нескольких страниц результатов поиска. Он отлично работает, когда я пытаюсь найти несколько записей, которые имеют предмет (в моем случае CHIEF_COMPLAINT) и комментарии с определенным словом. Проблема в том, когда я хочу искать серийные номера.Linq Присоединиться, когда вторая таблица будет иметь несколько записей

Здесь есть две проблемы. Один из них заключается в том, что к конкретному билету могут быть прикреплены несколько единиц оборудования, а также отдельное оборудование может быть связано с несколькими билетами. Когда я запрашиваю таблицу, используемую для привязки оборудования к билетам (VIEW_WT_EQUIP, используя представление, потому что там, где отображается серийный номер), я могу получить несколько результатов с одним и тем же Ticket_ID.

Это запрос, который у меня есть сейчас, но он не возвращает никаких результатов, когда я помещаю серийный номер, который, как я знаю, находится в системе.

var query = from a in db.VIEW_WT_HEADERs 
        join c in db.VIEW_WT_EQUIPs on a.TICKET_ID equals c.TICKET_NUMBER into c_group 
        from c2 in c_group 
        join b in db.WT_EVENTs on a.TICKET_ID equals b.TICKET_ID 
        where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) || c2.SERIAL_NUMBER.Contains(input) 
        orderby a.TICKET_ID descending 
        select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS }; 

Я также попробовал метод, где я использовал 2 Linq запросов и поставить все номера билета из последовательного поиска номера в списке, но второй запрос не нравится, что я пытался сравнить целочисленный массив ,

Я думаю, что я просто собираюсь сделать это неправильно. Присоединиться, вероятно, не самый правильный способ сделать это, но я не знаю, как сообщить основному запросу, чтобы вытащить все билеты, связанные с частью оборудования.

Пожалуйста, дайте мне знать, где я могу уточнить, потому что я знаю, что это объяснение грубо.

ответ

2

Я бы поставил это как комментарий вместо ответа, но я хочу показать вам код, поэтому мне пришлось выбрать «ответ».

Если вы используете Linq to Entities, вы, вероятно, имеете отношение между объектами. Это означает, что join не требуется. Вы должны использовать соединение только в том случае, если недоступно свойство навигации.

Я не могу точно сказать, что вы должны сделать, но вот некоторый код может быть полезным:

var query = from a in db.VIEW_WT_HEADERs 
      from b in a.WT_EVENTs 
      from c in a.VIEW_WT_EQUIPs 
      where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) ... 
      orderby a.TICKET_ID descending 
      select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS }; 

вы также можете использовать let для хранения суб-выражение:

var query = from a in db.VIEW_WT_HEADERs 
      from b in a.WT_EVENTs 
      from c in a.VIEW_WT_EQUIPs 
      let x = c.FirstOrDefault() 
      where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) || x.SomeProperty .... 
      orderby a.TICKET_ID descending 
      select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS }; 

Это просто пример, может быть, это помогает!

+0

Спасибо за отзыв. Я буду работать в моем файле DataClasses и попытаюсь улучшить настройку Linq. Единственная проблема с предложением, которое вы дали, это FirstOrDefault(). На самом деле это может быть правильно, но я был бы обеспокоен, если часть оборудования появится на нескольких билетах. Поэтому, если я скажу x.SERIAL_NUMBER.Contains (input), он отобразит только первый найденный. Я думаю, если бы я мог (x.SERIAL_NUMBER.Contains (input) && x.TICKET_ID! = X.TICKET_ID). Фу, это даже не имеет смысла. –

+0

Итак, вместо FirstOrDefault вы можете использовать Any(). Как 'x.Any (i => i.Serial_Number.Contains (что-то))' –

+0

Продолжает сообщать мне, что мой VIEW не имеет определения для Any. –

Смежные вопросы