2009-07-09 7 views
1

OK Je me cogner la tête contre un mur avec celui-ci ;-)Subsonic 3 LINQ Projection Problème

tables données dans ma base de données appelée Adresse, Client et CustomerType, je veux afficher des informations de synthèse combiné sur le client donc je crée une requête pour joindre ces deux tables et récupérer un résultat spécifié.

var customers = (from c in tblCustomer.All() 
         join address in tblAddress.All() on c.Address equals address.AddressId 
         join type in tblCustomerType.All() on c.CustomerType equals type.CustomerTypeId 
         select new CustomerSummaryView 
            { 
             CustomerName = c.CustomerName, 
             CustomerType = type.Description, 
             Postcode = address.Postcode 
            }); 

    return View(customers); 

CustomerSummaryView est un simple POCO

public class CustomerSummaryView 
{ 
    public string Postcode { get; set; } 
    public string CustomerType { get; set; } 
    public string CustomerName { get; set; } 
} 

Maintenant, pour une raison quelconque, cela ne fonctionne pas, je reçois une liste IEnumerable des résultats CustomerSummaryView, chaque enregistrement a un nom de client et un code postal, mais la Le champ de type client est toujours nul.

J'ai recréé ce problème plusieurs fois avec différentes tables de base de données et classes projetées.

Quelqu'un a des idées?

Répondre

2

Je ne peux pas repro cette question - voici un test que je viens d'essayer:

[Fact] 
public void Joined_Projection_Should_Return_All_Values() { 
    var qry = (from c in _db.Customers 
        join order in _db.Orders on c.CustomerID equals order.CustomerID 
        join details in _db.OrderDetails on order.OrderID equals details.OrderID 
        join products in _db.Products on details.ProductID equals products.ProductID 
        select new CustomerSummaryView 
        { 
         CustomerID = c.CustomerID, 
         OrderID = order.OrderID, 
         ProductName = products.ProductName 
        }); 

    Assert.True(qry.Count() > 0); 

    foreach (var view in qry) { 
     Assert.False(String.IsNullOrEmpty(view.ProductName)); 
     Assert.True(view.OrderID > 0); 
     Assert.False(String.IsNullOrEmpty(view.CustomerID)); 
    } 

} 

Ce passé parfaitement. Je me demande si vous utilisez un mot réservé là-dedans?

+0

Hey Rob, je pense que votre test passe parce que vos correspondances sont des correspondances exactes. Jon fait CustomerType = type.Description, et cela s'avère être la seule propriété avec laquelle il a des problèmes. Je suis tombé sur quelque chose de très similaire http://stackoverflow.com/questions/1734146/subsonic-3-linq-projecting-anonymous-types-but-not-class-types –

0

Oui, la raison pour l'exemple de Rob travaille est parce que son noms de propriété de projection correspondent exactement, alors que par exemple original de John a une différence entre CustomerType et type.Description.

Cela ne devrait pas avoir été un problème, mais il était - le Projecteur Mappeur recherchait des propriétés du même nom et ne mappait pas de valeur s'il ne trouvait pas de correspondance. Par conséquent, les propriétés de vos objets de projection seraient des valeurs par défaut pour son type s'il n'y avait pas de correspondance exacte.

Les bonnes nouvelles sont, j'ai obtenu la dernière source aujourd'hui et ai construit un nouveau Subsonic.Core.dll et le comportement est maintenant fixé. Donc, le code de John ci-dessus devrait fonctionner comme prévu.

0

Je viens de télécharger la dernière version à partir du 21/03/2010, soit environ 2 mois après la dernière affiche sur ce sujet, et le problème existe toujours dans le binaire empaqueté. Bummer.

Voici ce que je dois faire:

 var data = 
      (from m in Metric.All() 
      where m.ParentMetricId == parentId 
      select new 
        { 
         m.MetricName, 
         m.MetricId, 
        }) 
        .ToList(); 

     var treeData = 
      from d in data 
      select new TreeViewItem 
        { 
         Text = d.MetricName, 
         Value = d.MetricId.ToString(), 
         LoadOnDemand = true, 
         Enabled = true, 
        }; 

     return new JsonResult { Data = treeData }; 

Si je tente de faire la projection directement à partir de la requête subsonique, le texte propriété se termine avec l'ID, et les extrémités propriété Valeur up avec le nom. Très étrange.