2010-10-11 5 views
1

Je cette requête LINQ:Aide dépannage LINQ requête

var returnList = from TblItemEntity item in itemList 
        join TblClientEntity client in clientList 
        on item.ClientNo equals client.ClientNumber 
        join TblJobEntity job in jobList 
        on item.JobNo equals job.JobNo 
        where item.ClientNo == txtSearchBox.Text //Is this filter wrong? 
        orderby client.CompanyName 
        select new { FileId = item.FileId, CompanyName = client.CompanyName, LoanStatus = item.LoanStatus, JobNo = job.JobNo, JobFinancialYE = job.JobFinancialYE, VolumeNo = item.VolumeNo }; 

Pourquoi ne pas retourner quoi que ce soit?

P/S: Tous sont de type données.

+0

Données d'échantillon! (et leurs types!) –

+1

Comment pouvons-nous dire que le filtre est faux, ou la jointure? Avez-vous essayé de déboguer cela en supprimant la ligne commentée? – Kobi

+0

Est-ce parce que j'ai utilisé clientno pour rejoindre les tables puis je ne peux pas utiliser clientno pour filtrer. –

Répondre

3

Avez-vous essayé de retirer des parties de la jointure pour déterminer où se situe le problème, puis de les réintégrer les unes après les autres? Commencez avec:

var returnList = from TblItemEntity item in itemList 
       where item.ClientNo == txtSearchBox.Text //Is this filter wrong? 
       select new { FileId = item.FileId }; 

Puisque vous faites des jointures internes, il se peut que l'une des jointures filtre tous les éléments. Lorsque le débogage ne développe pas le type de retour, le select new {FileId = item.FileId} est tout ce dont vous avez besoin pour déboguer.

+0

Je le pensais aussi, ce sont les jointures qui causent le problème. –

+0

Des moyens de rejoindre ceux que j'ai besoin de filtrer? –

+1

Bien sûr, vous pouvez rejoindre sur les variables que vous avez besoin de filtrer. Il est difficile de vous dire exactement ce que vous devriez faire puisqu'il n'y a pas de données d'exemple et vous ne dites pas quel résultat vous attendez. Vous pouvez essayer une jointure à gauche, mais encore une fois, cela dépend du résultat que vous voulez. –

0

Pourquoi cela ne renvoie-t-il rien?

Là deux possibilitées:

1) La jointure est vide, c'est pas des objets, des clients et des emplois ont ID correspondants de.

2) La clause where est fausse pour tous les enregistrements de la jointure.

Pour résoudre ce problème, vous devrez supprimer la clause where et/ou certaines des tables jointes pour voir ce qu'il faut pour obtenir des résultats.

+0

1) La clause de jointure est correcte , je l'ai enlevé et il m'a rendu quelque chose –

+0

2) J'ai essayé d'utiliser d'autres attributs (Autres que ceux que j'avais l'habitude de rejoindre), cela fonctionne mais pas ceux que j'ai l'habitude de rejoindre. –

0

Toujours en attente sur les données d'exemple.

Vous dites que les résultats filtrent d'autres attributs, alors pourquoi cela devrait-il être différent? En supposant que l'entrée utilisateur txtSearchBox a une valeur raisonnable, essayez d'imprimer les valeurs sur la console de débogage et voyez si vous obtenez des résultats raisonnables. Regardez la fenêtre de sortie. Essayez cette version dans votre version:

Func<string,bool> equalsSearch = s => 
{ 
    var res = s == txtSearchBox.Text; 
    Debug.WriteLine("\"{0}\" == \"{1}\" ({2})", s, txtSearchBox.Text, res); 
    return res; 
}; 
var returnList = from TblItemEntity item in itemList 
       join TblClientEntity client in clientList 
        on item.ClientNo equals client.ClientNumber 
       join TblJobEntity job in jobList 
        on item.JobNo equals job.JobNo 
       //where item.ClientNo == txtSearchBox.Text //Is this filter wrong? 
       where equalsSearch(item.ClientNo) //use our debug filter 
       orderby client.CompanyName 
       select new { FileId = item.FileId, CompanyName = client.CompanyName, LoanStatus = item.LoanStatus, JobNo = job.JobNo, JobFinancialYE = job.JobFinancialYE, VolumeNo = item.VolumeNo };