2010-01-09 8 views
0

J'utilise la dernière version de SubSonic 3 et ActiveRecord. J'essaye de faire une jointure gauche dans LINQ. Il échoue avec une erreur quelque part dans SubSonic.LINQ Left Join provoque une erreur dans SubSonic.Core

J'ai un objet Véhicule et un objet VehicleImage Le véhicule peut avoir plusieurs images, mais ce n'est pas obligatoire. donc une jointure à gauche est appropriée.

C'est ce que je

var vehicle = from v in Vehicle.All() 
       join dl in DealerLocation.All() on v.DealerLocationID equals dl.ID 
       join vi in VehicleImage.All() on v.ID equals vi.VehicleID into VehicleImages 
       from vij in VehicleImages.DefaultIfEmpty() 
       && vij.IsPrimary 
       select new 
       { 
        v, vij.Image 
       }; 

Ceci est l'erreur que je reçois

The expression of type 'System.Linq.IQueryable`1[<>f__AnonymousType1`2[<>f__AnonymousType0`2[Project.Data.Vehicle,Project.Data.DealerLocation],System.Collections.Generic.IEnumerable`1[Project.Data.VehicleImage]]]' is not a sequence 

Ceci est la trace de la pile

 
    at SubSonic.Linq.Translation.QueryBinder.ConvertToSequence(Expression expr) 
    at SubSonic.Linq.Translation.QueryBinder.VisitSequence(Expression source) 
    at SubSonic.Linq.Translation.QueryBinder.BindSelectMany(Type resultType, Expression source, LambdaExpression collectionSelector, LambdaExpression resultSelector) 
    at SubSonic.Linq.Translation.QueryBinder.VisitMethodCall(MethodCallExpression m) 
    at SubSonic.Linq.Structure.ExpressionVisitor.Visit(Expression exp) 
    at SubSonic.Linq.Structure.DbExpressionVisitor.Visit(Expression exp) 
    at SubSonic.Linq.Translation.QueryBinder.Visit(Expression exp) 
    at SubSonic.Linq.Translation.QueryBinder.Bind(QueryMapping mapping, Expression expression) 
    at SubSonic.Linq.Structure.QueryMapping.Translate(Expression expression) 
    at SubSonic.Linq.Structure.DbQueryProvider.Translate(Expression expression) 
    at SubSonic.Linq.Structure.DbQueryProvider.GetExecutionPlan(Expression expression) 
    at SubSonic.Linq.Structure.DbQueryProvider.Execute(Expression expression) 
    at SubSonic.Linq.Structure.QueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) 
    at SubSonic.Linq.Structure.Query`1.GetEnumerator() 
    at System.Linq.SystemCore_EnumerableDebugView`1.get_Items() 

Merci à l'avance pour tout comprendre.

Répondre

1

Il semble qu'il n'y ait pas encore de solution pour cela. Un correctif simple (quoique incorrect) consiste à créer une vue qui gère la jointure à gauche et remplit les données vides à partir de la droite avec les données par défaut et que SubSonic fasse une simple jointure sur cette vue. Je sais que c'est terrible mais c'est une solution pour l'instant. Je ne pouvais pas voir tomber SubSonic en raison de cette limitation. Je suis sûr que ce sera corrigé bientôt.

1

Essayer Fluent Query peut être une solution pour l'instant peut-être. Quelque chose comme:

var DB = new myDB(); 
IList<LiteObject> myLiteObject = DB.Select 
    .From<Table1>() 
    .InnerJoin<Table2>() 
    .LeftOuterJoin<Table3>() 
    .Where(Table1.IdColumn).IsEqualTo(1) 
    .And(Table2.IdColumn).IsEqualTo(2) 
    .ExecuteTypedList<LiteObject>(); 

où LiteObject comprend des champs de toutes les tables.

+0

On dirait que la requête Fluent peut faire ce dont j'ai besoin pour le moment mais j'ai un autre problème. Je n'ai pas un bon moyen d'obtenir mes données à partir de plusieurs tables dans les résultats de la liste de requête fluide. J'ai un certain nombre de tables qui sont jointes à où les noms de colonnes sont les mêmes que les autres tables. Avec LINQ, j'utilisais ces colonnes comme alias. La requête courante ne semble pas avoir de support pour cela. L'exécution de la liste typée ne fonctionnera donc pas car les noms de colonnes ne peuvent pas correspondre aux noms de ma classe. Ai-je oublié quelque chose dans Fluent Query? –

+0

En fait, grattez ça. Fluent Query ne table pas les noms de colonnes qualifiées dans FindColumn afin que vous obteniez beaucoup de la même colonne dans votre requête. Cela a toutes sortes de problèmes. Je suppose que je vais créer une vue. –

+0

je n'ai pas essayé encore, mais la docs dit (Simple Sélectionnez avec des colonnes dactylographiées): records int = new NorthwindDB.Select ( nouvelle string [] { ProductTable.ProductIDColumn, Product.ProductNameColumn}) .De () .GetRecordCount(); – Aytek