2010-11-19 2 views
1

in der folgenden AbfrageLinq to SQL und enthält Operatoren

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 }; 

I

p.brimsec == q.primary_bsec 

mit

p.brimsec.StartsWith (q.primary_bsec ) 

aber ich erhalte den folgenden Fehler ersetzen müssen:

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

Wie kann ich das machen?

+0

hat linq-to-sql keine Navigationseigenschaft, um dem Fremdschlüssel für Sie zu folgen? Nur neugierig –

+0

nein ... beide Tabellen sind auf verschiedenen Servern – bmanu

Antwort

0

Grundsätzlich kann die LINQ to SQL nicht wissen, wie Startswith zu Sql konvertieren. Dies liegt daran, dass Ihre linq intern zur Laufzeit in sql generiert wird.

Sie können dies erreichen, indem Sie eine UDF (benutzerdefinierte Funktion in sql) erstellen und sie aus Ihrer linq-Anweisung verwenden.

Der Artikel ist wie folgt: http://msdn.microsoft.com/en-us/library/bb399416.aspx

Andrew

0

Ich denke, das Problem, das Sie in ist, ist, dass linq-to-sql keine Übersetzung von String.StartsWith in SQL hat. String.Contains funktioniert jedoch - Sie müssten die resultierende Sammlung durchgehen und die Elemente herausfiltern, die nicht mit q.primary_bsec beginnen.

+0

Enthält würde funktionieren, aber ich bekomme den gleichen Fehler – bmanu

1

die LINQ to SQL Übersetzer Leider nicht intelligent genug, um diesen Code zu übersetzen, aber es gibt einen Trick, der das gleiche erreicht:

p.brimsec.StartsWith (q.primary_bsec ) 

Verschiebt zu:

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

Der LINQ to SQL-Umsetzer erledigt das problemlos, und die Semantik entspricht StartsWith.

Ehrlich gesagt, ich sehe nicht, warum Starts übersetzen richtig für die serverseitige Argumente so schwer war, dass die LINQ-Entwickler beschlossen, nur statt einen Fehler zu werfen.