2009-08-25 10 views
2

die linqtemplates verwenden, habe ich versucht, die Linq-Syntax immer in der Nähe zu dem, was in den docsSubSonic 3 Linq Probleme Join

 var query = from c in db.CountyLookups 
        join s in db.StateLookUps on 
        c.StateLookupID equals 
        s.StateLookupID 
        where c.Name2 == countyName && 
        s.Abbr == stateAbbr 
        select new 
        { 
         Latitude = c.Latitude, 
         Longitude = c.Longitude 
        }; 

     var result = query.SingleOrDefault(); 

aber wenn .SingleOrDefault() aufgerufen wird, ich einen gelben Bildschirm von darn erhalten, die besagt, :

System.NotSupportedException: das Element 'StateLookupID' nicht unterstützt

die Stapelüberwachung endet am:

SubSonic.Linq.Structure.TSqlFormatter.VisitMemberAccess(MemberExpression m) 

Die StateLookupID-Spalte hat Unterstreichungszeichen in der Datenbank und ist ein reguläres int pk/fk.

was mache ich falsch?

+0

Welche Datentypen sind StateLookupID? Ganzzahlen? –

+0

Wenn Sie subsonicproject @ googlegroups das Schema emailen können - ich werde sehen, ob ich es einrichten und spelunk. Ich schaue mir die Tests an und wir machen viel mehr. –

+0

hmmz, mit Blick auf die Classes.cs gibt es keine Foreign Keys für diese Typen definiert, heißt das? StateLookupID ist Int für beide. Ich werde das Schema exportieren. Danke für deine Hilfe, Rob! – ChrisPelatari

Antwort

2

Offensichtlich VisitMemberAccess hat keine Ahnung, was mit einem int, nur String und datetime zu tun (beginnend in Zeile 152 von SubSonic.Linq.Structure.TSqlFormatter). Ich weiß nicht, warum das bei einem Join aufgerufen würde, da ein Join normalerweise zwischen einem int pk/fk liegt (oder guid, wenn du willst).

Ich endete die Verschrottung der Linq-Abfrage zugunsten von SubSonic.Query.Select. Hier ist mein neuer Code, der funktioniert:

 var query = db.Select.From<CountyLookup>() 
      .InnerJoin<StateLookUp>() 
      .Where(CountyLookupTable.Name2Column) 
      .IsEqualTo(countyName) 
      .And(StateLookUpTable.AbbrColumn) 
      .IsEqualTo(stateAbbr); 

ich dann ExecuteTypedList aufrufen und die Ergebnisse zurück an meine Modellklasse zuordnen. Funktioniert wie Butta. Wollte in diesem Fall nur linq verwenden.

+0

Ich habe diesen Thread beobachtet. Ich denke, ich bekomme den gleichen Fehler bei der Verwendung von GUIDs. Vielen Dank –

0

Ich bekomme diesen Fehler, wenn ich Eigenschaften zu meinen Modellen hinzugefügt habe (die IsValid-Eigenschaft wie in ASP.Net MVC 1.0 erwähnt, danke Rob). Ich habe dieses Problem für ein bisschen ein- und ausgeschaltet, und ich denke, ich habe es auf den Abfrage-Generator genagelt, der versucht, eine Abfrage für etwas zu erstellen, das in Code, nicht TSQL getan werden sollte.

Wenn es versucht, das SQL zu erzeugen, steigt es den Pfad herunter, um die TSQL über VisitMemberAccess für einen komplexen Typ (vielleicht ein anderes Modell) zu generieren, aber es weiß nur, wie man Datumsangaben und Zeichenfolgen in VisitMemberAccess ausführt. Es tut mir leid, wenn das ein bisschen zusammenhangslos ist, aber ich versuche, mich darum zu kümmern.

Um dies zu umgehen in Betracht ziehen, etwas wie LinqKit AsExpandable vor jeder Operation, die die TSQL-Generation tun wird. Ich habe das auf einem einfachen OrderBy versucht, der BANG ging und es scheint zu funktionieren, aber ich habe noch keine Ahnung, was es zur Leistung tun wird.

0

Eigentlich nehme ich das zurück ich durch mein Problem Problem überwunden

Stuff.All tun(). Wo (x => x.Someid == id) .ToArray() .AsQueryable() .Where (x => x.SomeProp.SomeFlag == true);

Es ist Crud, aber es funktioniert.

0

Dies scheint immer noch ein Problem zu sein; nämlich in einfachen Fällen wie:

var list = from lang in db.Languages 
         join site in db.SiteConfigLanguages on 
         lang.Code equals site.LanguageCode 
         select lang; 

Dies sollte auf einfache SQL (wenn auch sinnlos in diesem Beispiel) bewerten:

SELECT Language.* FROM Language LEFT JOIN SiteConfigLanguage ON Language.Code = SiteConfigLanguage.LanguageCode; 

Es scheitert in der gleichen VisitMemberAccess Funktion als (in diesem Fall) Sprache ist kein erkennbarer Deklarationstyp (zB String oder DateTime). Es ist der Beschreibung @matware sehr ähnlich, aber es klingt, als wäre das "IsValid" -Member reiner C# -Code, während in diesem Fall lang.Code einfach eine Referenz auf eine Spalte in der Datenbank ist.

Ich untersuche derzeit Problemumgehungen, da dies nur ein Teil der größeren LINQ-Abfrage ist, die für mich fehlschlägt; Wenn ich etwas finde, werde ich es hier posten. Sonst sind alle anderen Lösungen/Workarounds für dieses Problem bekannt?

UPDATE: Ignoriere mich hier; Das liegt einfach daran, dass mir eine einfache Zeile in der LINQ-Anweisung fehlt. Sie müssen sicherstellen, dass Sie das Schlüsselwort "in" verwenden, um die Dinge abzuschließen!

heißt

var list = from lang in db.Languages 
       join site in db.SiteConfigLanguages on 
       lang.Code equals site.LanguageCode into sl 
       from siteLang in sl.DefaultIfEmpty() 
       select lang; 

ich einen anderen Fehler Geist Sie haben aber zumindest diese besondere Ausnahme gelöst. Der nächste sieht leider etwas böser aus (in der System.Linq-Bibliothek).