Question

J'utilise VS2008 (aucune option pour VS2010 en ce moment) et je suis en train de faire un (inverse) Contient pour essayer de correspondre à une chaîne partielle à une chaîne entière. Par exemple, le urlRef = http://www2.rivworks.com/feed-test-1/?SSScrollPosition=0 et defaultUrlDomain = www2.rivworks.com.

IList<vwCompanyDetails> efMatchingUrlCompanyList = null;
...
efMatchingUrlCompanyList = _dbRiv.vwCompanyDetails
                                 .Where(a => urlRef.Contains(a.defaultURLDomain) 
                                          && a.isCompanyDeleted == false)
                                 .ToList();
bool foundCompanyUrl = (efMatchingUrlCompanyList.Count > 0);

En regardant ma base de données, je devrais obtenir 3 enregistrements de cette requête. Au lieu de cela, je reçois zéro enregistrements dans efMatchingUrlCompanyList. (Modifiée)

Toutes les idées ou devrai-je obtenir tous les détails de l'entreprise puis faire une vérification manuelle de chaque enregistrement dans une boucle?


NOTE:

J'ai ajouté un moyen secondaire de faire ceci et cela fonctionne.

var efMatchingUrlCompanyList2 = _dbRiv.vwCompanyDetails.Where(a => a.ClientID != null && a.ClientID > 0 && a.defaultURLDomain != null).ToList();
foreach (vwCompanyDetails myDetail in efMatchingUrlCompanyList2)
{
    if (urlRef.ToLower().Contains(myDetail.defaultURLDomain.ToLower()))
    {
        efMatchingUrlCompanyList.Add(myDetail);
    }
}
foundCompanyUrl = (efMatchingUrlCompanyList.Count > 0);

J'ai ajouté la clause WHERE pour raccourcir le bas le record à quelque chose que je savais serait valide. Je vais continuer à jouer avec l'original pour voir si je peux le faire fonctionner comme prévu.


NOTE 2: J'ai téléchargé et je utilise LINQPad. Je me suis connecté à mon modèle EF et créé ce petit morceau de code:

void Main()
{
    IList<vwCompanyDetails> efMatchingUrlCompanyList = null;
    string urlRef = "http://www2.rivworks.com";
    efMatchingUrlCompanyList = vwCompanyDetails.Where(a => urlRef.Contains(a.defaultURLDomain) && a.isCompanyDeleted == false).ToList();
}

Je regardais le SQL généré et c'est ce qu'il produit (je coupe 90% des colonnes par souci de brièveté):

-- Region Parameters
DECLARE p__linq__1 NVarChar(17) SET p__linq__1 = 'http://www2.rivworks.com'
-- EndRegion
SELECT 
[Extent1].[CompanyId] AS [CompanyId], 
[Extent1].[CompanyName] AS [CompanyName], 
[Extent1].[isCompanyDeleted] AS [isCompanyDeleted], 
[Extent1].[ClientID] AS [ClientID], 
[Extent1].[defaultURLDomain] AS [defaultURLDomain], 
FROM (SELECT 
      [vwCompanyDetails].[CompanyId] AS [CompanyId], 
      [vwCompanyDetails].[CompanyName] AS [CompanyName], 
      [vwCompanyDetails].[isCompanyDeleted] AS [isCompanyDeleted], 
      [vwCompanyDetails].[ClientID] AS [ClientID], 
      [vwCompanyDetails].[defaultURLDomain] AS [defaultURLDomain], 
      FROM [dbo].[vwCompanyDetails] AS [vwCompanyDetails]) AS [Extent1]
WHERE ((CAST(CHARINDEX([Extent1].[defaultURLDomain], @p__linq__1) AS int)) > 0) 
AND (0 = [Extent1].[isCompanyDeleted])

Je copier / coller ce dans SQL et Mangler essayé de l'exécuter. Je suis une erreur. Je regardais la définition à nouveau et, ô miracle - la variable p__linq__1 NE ont un symbole @. Il essaie de le traiter comme un curseur à la place! J'ai ajouté manuellement le symbole @ dans SQL Mangler et il fonctionne parfaitement!

Alors, la question suivante - Pourquoi est-il fait cela? Est-ce un problème connu?

Était-ce utile?

La solution 3

Puisque personne ne peut se présenter sur le SQL généré j'ai choisi d'utiliser la route moins efficace que dans ma première note. Bummer vraiment ...

Autres conseils

Je ne vois pas de problème avec votre code. Mais efMatchingUrlCompanyList ne devrait jamais être null directement après la requête - à la place, il doit contenir une liste vide. Si vous trouvez vraiment null lorsque vous accédez à la variable, vous avez probablement un bug en dehors du code inclus dans la question.

L'instruction where ne retourne pas vrai. Absolument.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top