2010-11-19 30 views
1

dans la requête suivanteLINQ to SQL Devenez membre et contient des opérateurs

var restrictions = from p in dcTrad.quop_restricted_items 
          where p.entry_status == 'P' && p.batch == "PRODUCTION" && p.problem != null 
          from q in dcTrad.model_companies 
          where q.co_name != null && p.brimsec == q.primary_bsec        
          select new { Company = q.co_name, Restriction = p.comment ?? "Restricted without comments", Portfolio = p.problem }; 

-je remplacer

p.brimsec == q.primary_bsec 

avec

p.brimsec.StartsWith (q.primary_bsec ) 

mais je reçois l'erreur suivante:

Only arguments that can be evaluated on the client are supported for the String.StartsWith method 

Comment puis-je faire ce travail?

+0

linq-to-sql ne possède-t-il pas de propriété de navigation pour suivre la clé étrangère pour vous? Juste curieux –

+0

non ... les deux tables sont sur des serveurs différents – bmanu

Répondre

0

Fondamentalement, linq à sql ne sait pas comment démarrer en Sql. En effet, à l'exécution, linq génère du code en SQL.

Vous pouvez y parvenir en créant un UDF (fonction définie par l'utilisateur en sql) et en l'utilisant à partir de votre instruction linq.

L'article est comme ci-dessous: http://msdn.microsoft.com/en-us/library/bb399416.aspx

Andrew

0

Je pense que le problème que vous rencontrez est que linq-to-sql n'a pas de traduction de String.StartsWith en SQL. String.Contains fonctionne, cependant - vous devez parcourir votre collection résultante et filtrer les éléments qui ne commencent pas par q.primary_bsec.

+0

Contient fonctionnerait, mais j'obtiens la même erreur – bmanu

1

Malheureusement, le LINQ traducteur SQL est pas assez intelligent pour traduire ce code, mais il y a un truc qui permet d'atteindre le même:

p.brimsec.StartsWith (q.primary_bsec ) 

se traduit par:

p.brimsec.SubString(0, q.primary_bsec.Length) == q.primary_bsec 

Le traducteur LINQ to SQL gère cela très bien, et la sémantique est équivalente à StartsWith. Franchement, je ne vois pas pourquoi la traduction de StartsWith correctement pour les arguments côté serveur était si difficile que les développeurs LINQ ont juste décidé de lancer une erreur à la place.