2012-12-11 5 views
1

J'ai une recherche qui cherche deux choses. Articles et contacts. Ils ont chacun leur propre table avec leurs propres attributs uniques. Je suis capable de rechercher avec succès chaque indépendant l'un de l'autre et de renvoyer les résultats à deux vues de liste. Mais est-ce moche et la pagination est devenue un problème alors je dois convertir ces deux tables en un résultat similaire que je peux afficher comme résultat de recherche. Ces résultats n'ont aucune relation directe les uns avec les autres. Le group t3 by new me dégoûte. Dois-je les regrouper pour que cela devienne un résultat similaire? Les résultats s'affichent actuellement dans un ListView en utilisant par exemple <%#Eval("ItemName") %>Linq query multple tables avec différents attributs

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>(); 


     } 

Répondre

1

Utilisation 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

Merci beaucoup! Cela a fonctionné parfaitement. Je dois changer quelque chose d'autre maintenant. Je relie de mes résultats en utilisant un QueryString. Existe-t-il un moyen que je puisse les identifier par type (article, contact) pour quand je lier à une page de détails? exemple 'NavigateUrl = '<% # Eval (" ID "," ~/LoggedIn/ContactDetails.aspx? ContactID = {0} ")%>' />' – jackncoke

+1

Ajouter un champ (comme Type = "Contact" ou "Élément ") au type anonyme. –

+0

En fait, je travaillais là-dessus! Merci encore ! – jackncoke