2009-08-26 8 views
0

J'ai une table qui contient des codes de procédure parmi d'autres données (appelons-la "MyData"). J'ai une autre table qui contient des codes de procédure valides, leurs descriptions et les dates auxquelles ces codes sont valides. Chaque fois que je veux faire rapport sur MyData et inclure la description de la procédure, je dois faire une recherche similaire à ceci:Comment ajouter des colonnes personnalisées à une table que LINQ to SQL peut traduire en SQL

From m in dc.MyDatas _ 
Join p in dc.Procedures On m.proc_code Equals p.proc_code _ 
Where p.start_date <= m.event_date _ 
And If(p.end_date.HasValue, p.end_date.Value, Now) >= m.event_date _ 
Select m.proc_code, p.proc_desc 

Comme il y a beaucoup d'endroits où je veux montrer la description de la procédure, cela devient malpropre. Je voudrais avoir la recherche définie dans un seul endroit, donc j'essayé de mettre cela dans une extension de MyData:

Partial Public Class MyData 
    Public ReadOnly Property ProcedureDescription() As String 
     Get 
      Dim dc As New MyDataContext 

      Return _ 
       (From p in dc.Procedures _ 
       Where p.proc_code = Me.proc_code _ 
       And p.start_date <= Me.event_date _ 
       And If(p.end_date.HasValue, p.end_date.Value, Now) >= Me.event_date _ 
       Select p.proc_desc).SingleOrDefault 
     End Get 
    End Property 
End Class 

qui fonctionne lors de l'affichage des données, mais vous ne pouvez pas l'utiliser dans une requête, car elle ne sait pas comment le transformer en une instruction SQL:

Dim test = _ 
    From x In dc.MyDatas _ 
    Select x.proc_code _ 
    Where x.ProcedureDescription.Contains("test") 

erreur: Le membre « MyProject.MyData.ProcedureDescription » n'a pas de traduction pris en charge à SQL. Existe-t-il un moyen de transformer une recherche complexe (c'est-à-dire une jointure non triviale) en quelque chose que SQL peut reconnaître pour que je puisse la définir en un seul endroit et la référencer comme un champ dans MyData ? Jusqu'à présent, la seule chose à laquelle je peux penser est de créer une vue SQL sur MyData qui fait le lien et l'apporte dans mon contexte de données, mais je voudrais essayer d'éviter cela. Toutes les idées seraient les bienvenues. Merci.

Répondre

1

Vous pouvez insérer un AsEnumerable() dans votre expression de requête. Cela vous permet de convertir tout à ce moment-là à un jeu de résultats afin que vos propriétés personnalisées peuvent être inclus dans le reste de l'expression (désolé, je ne fais pas VB):

var test = _ 
    (from x in dc.MyDatas 
    (select x.proc_code).AsEnumerable(). 
    Where(x => x.ProcedureDescription.Contains("test")); 
+0

Je l'ai fait quelque chose de similaire dans des situations similaires , mais le problème ici est que "MyData" pourrait être énorme, et la partie étroite de la requête viendrait après la conversion à un ensemble de résultats. Encore une réponse valable dans une majorité de situations cependant. – gfrizzle