2013-03-19 1 views
0

J'ai eu du mal à obtenir un moyen possible de filtrer mes ensembles de résultats sur certains critères, l'un d'eux étant la recherche en texte intégral. Après l'écrémage, peu de blogs ont appris à connaître Linq ne le supporte pas directement et il y a un work around qui avait du sens. J'ai donc commencé avec cette approche, mais je suis tombé dans l'impasse quand il m'est apparu que je ne peux pas utiliser les fonctions de table dans .net 4.0 (.net 4.5 supporte mais que je ne peux pas utiliser (fonction import) à partir de maintenant).Comment y parvenir Recherche plein texte dans Linq (.net 4.0)

Ensuite, je rencontre un autre work around pour utiliser des fonctions personnalisées en éditant le fichier ssdl et ajouter des détails de la fonction (en utilisant le texte de commande pour une requête personnalisée).

Mon UDF ressemble ci-dessous: -

CREATE FUNCTION udf_CandidateFTS 
( 
    @keywords nvarchar(4000) 
) 
RETURNS @resCandidates TABLE 
(
    CandidateID INT, 
    FileRank INT 
) 
AS 
BEGIN 

    INSERT INTO @resCandidates 
    (
     CandidateID, 
     FileRank 
    ) 
    SELECT c.CandidateID, fileContent.Rank as FileRank 
      FROM CONTAINSTABLE (FileContent, Content, @keywords) as fileContent 
      INNER JOIN [file] f on f.ContentID = fileContent.[Key] 
      INNER JOIN [Candidate_Resume] c on c.CandidateID = f.[ID] 

    RETURN 
END 

J'ai effectué mon fichier SSDL: -

<Function Name="GetCandidateWithTextSearch" IsComposable="false"> 
    <CommandText> 
     SELECT * from 
     dbo.udf_CandidateFTS(@keywords) 
    </CommandText> 
    <Parameter Name="keywords" Type="nvarchar" Mode="In" /> 
    </Function> 

et a ajouté un EDMFunction: -

public class MyFunctions 
    { 
     [EdmFunction("MMJ.Service.Data", "GetCandidateWithTextSearch")] 
     public static IList GetCandidateWithTextSearch(string keywords) 
     { 
      throw new NotSupportedException(); 
     } 
    } 

Et ainsi que d'autres filtres je veux faire ce qui suit: -

var query = context.Candidate 
.Where(c => c.ID.Equals(MyFunctions.GetCandidateWithTextSearch("wali") 
.Contains(c.ID))).ToList(); 

Veuillez nous aider!

Répondre

1

Cela ne fonctionnera pas. La première solution de contournement utilise la fonction de table mappée - elle requiert .NET 4.5. La deuxième solution de contournement utilise un mappage équivalent à la procédure stockée. Les différences entre les deux sont:

  • Le premier est composable. Il peut être utilisé dans les requêtes Linq-to-entities et est traduit en appel de fonction SQL.
  • La seconde n'est pas composable. Il peut être simplement exécuté et énuméré. Tout le reste doit s'exécuter dans votre application en tant que Linq-to-objects.

Dans .NET 4.0, la meilleure option est d'utiliser la deuxième approche et écrire toute requête SQL dans DefiningQuery section (vous ne pouvez pas ajouter d'autres conditions de votre application). Ou simplement créer une procédure stockée et la mapper à travers le concepteur.

+0

Il y avait tout simplement beaucoup de problèmes avec l'intégration avec linq ... j'ai fait un proc Stored et je le fais vieux ADO.net façon ... déçu ... – Wali