2012-12-11 3 views
1

У меня есть поиск, который ищет две вещи. Элементы и контакты. У каждого из них есть собственный стол с собственными атрибутами unqiue. Я могу успешно искать каждого независимого пользователя и возвращать результаты в два списка. Но неужели уродливость и пейджинг стали проблемой, поэтому мне нужно преобразовать эти две таблицы в похожий результат, который я могу отобразить в качестве результата поиска. Эти результаты не имеют отношения напрямую с eachother.Linq query multple tables with different attributes

group t3 by new отбрасывает меня. Нужно ли мне группировать их, чтобы они стали похожими результатами? Результаты в настоящее время получить отображаются в ListView, используя, например <%#Eval("ItemName") %>

ItemContext db = new ItemContext(); //DB connection (Item,Contact) 
      var q = (from t1 in db.Item 
        join t2 in db.Categories on t1.CategoryID equals t2.CategoryID 
        join t7 in db.Divisions on t1.DivisionID equals t7.DivisionID 
        from t3 in db.Contacts 
        join t4 in db.Categories on t3.CategoryID equals t4.CategoryID 
        join t5 in db.Divisions on t3.DivisionID equals t5.DivisionID 
        join t6 in db.ContactTitle on t3.ContactTitlesID equals t6.ContactTitlesID 


        where 


        (DDLInt == 1 || t3.DivisionID == DDLInt) && 

         //Contains 

        (
        t3.ContactName.Contains(keyword) || 
        t3.ContactEmail.Contains(keyword) || 
        t3.ContactOPhone.Contains(keyword) || 
        t3.ContactID.Equals(searchID) 


        ) 
        group t3 by new 
        { 
         t3.ContactID, 
         t3.ContactName, 
         t3.ContactOPhone, 
         t3.ContactCell, 
         t3.ContactEmail, 
         t3.DivisionID, 
         t3.CategoryID, 
         t4.CategoryName, 
         t5.DivisionName, 
         t6.ContactTitlesName 

        } 

         into i 

        select new 
        { 
         i.Key.ContactID, 
         i.Key.ContactName, 
         i.Key.ContactOPhone, 
         i.Key.ContactEmail, 
         i.Key.ContactCell, 
         i.Key.CategoryName, 
         i.Key.DivisionName, 
         i.Key.CategoryID, 
         i.Key.DivisionID, 
         i.Key.ContactTitlesName 
        }); 


      return q.ToList<dynamic>(); 


     } 

ответ

1

Использование Union():

var contacts = from c in db.Contacts 
       select new { 
          Id = c.ContactID, 
          Name = c.ContactName, 
          Phone = c.ContactOPhone, 
          ... 
          CategoryName = c.Category.CategoryName, 
          DivisionName = c.Division.DivisionName, 
          ContactTitlesName = c.ContactTitle.ContactTitlesName 
         } 
var items = from t1 in db.Item 
      select new { 
         Id = t1.ItemID, 
         Name = t1.ItemName, 
         Phone = t1.??, // string.Empty? 
         ... // more properties corresponding 
          // with the ones above 
         CategoryName = t1.Category.CategoryName, 
         DivisionName = t1.Division.DivisionName, 
         ContactTitlesName = string.Empty 
         } 
var all = contacts.Union(items); 
+0

Большое спасибо! Это сработало отлично. Мне нужно сейчас что-то изменить. Я ссылаюсь на свои результаты с помощью QueryString. Есть ли способ, чтобы я мог идентифицировать их по типу (Item, Contact), когда я ссылаюсь на страницу сведений? Пример «NavigateUrl =» <% # Eval («ID», «~/LoggedIn/ContactDetails.aspx? ContactID = {0}»)%> '/> ' – jackncoke

+1

Добавить поле (например, Type =" Contact "или" Item ") анонимному типу. –

+0

Я на самом деле просто работал над этим! Еще раз спасибо! – jackncoke