2009-07-08 12 views
0

Ich möchte Linq zu SQL in meiner Windows-Formularanwendung verwenden.Extrahieren von generischen Linq-Abfragen

Die Daten in der lokalen Datenbank werden vom Web-Service abgerufen oder lokal erstellt.

Wenn ein Unternehmen geholt wurde aus dem Web Service es ExternalId

eingerichtet hat

Ich muss häufig Code verwenden, wie unten Objekte durch ihre ExternalId zu holen:

var user = (from u in db.User 
      where u.ExternalId == userExternalId 
      select u).First(); 

var location = (from l in db.Location 
      where l.ExternalId == locationExternalId 
      select l).First(); 

So habe ich aber über Ändern es auf eine generische Funktion wie die folgende Liste:

internal TEntity FetchByExternalId<TEntity>(System.Data.Linq.Table<TEntity> table, 
               int externalId) 
where TEntity: IExternalStorable 
{ 
    return (from obj in table 
      where obj.ExternalId == externalId 
      select (TEntity)obj).First(); 
} 

Leider sind solche Funktion nicht kompiliert:

  1. Ich kann nicht IExternalStorable zu Entity-Klasse hinzufügen, wie der Code aus der Datenbank generiert wird (I obwohl ich über partielle Klassen verwenden, aber es nicht zu funktionieren scheint)
  2. Es C# beklagt, dass TEntity isn‘ t Referenztyp Ich bin mir nicht sicher, wie das generische "where" constrain aussehen sollte.

Irgendwelche Ideen, wie man linq in generischen Funktionen benutzt?

Antwort

1

1: Teilklassen sollten wirklich funktionieren. Haben Sie überprüft, dass die Namespaces identisch sind? Welchen Fehler bekommst du?

2: sollte

where TEntity : class, IExternalStorable 

da sonst könnte es sein, sagen wir, eine andere Schnittstelle, die nicht

instanziiert werden konnte
+0

Re: 1. Es war ein Problem mit dem Namespace :) Danke. –

+0

Problem gelöst. Vielen Dank! –

2

Betrachten Sie den Rahmen nutzen, anstatt Ihre eigenen Walz:

Location location = db.Locations 
    .First(loc => loc.ExternalId == locationExternalId); 
+0

Danke :) Ich werde meinen Code aktualisieren –