2009-01-26 4 views
0

J'ai des tables order-items. donc je veux afficher sur une grille toutes les informations de commande y compris un col comme total_itemsLinq - somme de la valeur du champ enfant lorsque la requête d'enregistrement enfant est ganaretée par diff func

Il y a un chemin de travail prémétitif. comme ceci:

TotalQuantity = 
    (from i in _db.ProposaItems 
    where i.ProposaID == p.ProposaID select i) 
    .Sum(q => q.Quantity) 

Mais ce n'est pas comme je le veux. Je veux utiliser 2 funcs:

Fonction 1:

//BizNet.SqlRepository.Data.ProposalItem   
public IQueryable<ProposaItem> GetItems(Guid ProposaID) 
{ 
    return from i in _db.ProposaItems 
     where i.ProposaID == ProposaID 
     select i; 
} 

Fonction 2.

public void GetProposas() 
{ 
    var x = from p in _db.Proposas 
      let t= GetItems(p.ProposaID) 
       .Sum(q => q.Quantity) 
      select new 
      { 
      ID = p.ProposaID, 
      TotalQuantity = t 
      }; 
} 

Pour moi, son look très simple. Mais dans la ligne

x.Count(); 

Le résultat est une exception.

"Member access 'Int16 Quantity' of 'BizNet.SqlRepository.Data.ProposaItem' not legal on type 'System.Linq.IQueryable`1[BizNet.SqlRepository.Data.ProposaItem]." 

" at System.Data.Linq.SqlClient.SqlMember.set_Expression(SqlExpression value)\r\n at System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.AccessMember(SqlMember m, SqlExpression expo)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitMember(SqlMember m)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitUnaryOperator(SqlUnary uo)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSimpleExpression(SqlSimpleExpression simple)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitUnaryOperator(SqlUnary uo)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlVisitor.VisitSequence(SqlSelect sel)\r\n at System.Data.Linq.SqlClient.SqlVisitor.VisitScalarSubSelect(SqlSubSelect ss)\r\n at System.Data.Linq.SqlClient.SqlVisitor.VisitSubSelect(SqlSubSelect ss)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSubSelect(SqlSubSelect ss)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitNew(SqlNew sox)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitIncludeScope(SqlIncludeScope scope)\r\n at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlBinder.Bind(SqlNode node)\r\n at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, ReadOnlyCollection`1 parentParameters, SqlNodeAnnotations annotations)\r\n at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)\r\n at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)\r\n at System.Data.Linq.DataQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)\r\n at System.Linq.Queryable.Count[TSource](IQueryable`1 source)" 

Il ya une explication à cela?

merci.

+0

Vous devrez nous indiquer quelle exception vous obtenez exactement et sur quelle ligne dans le code S'il vous plaît. – Noldorin

Répondre

1

Je ne pense pas que vous pouvez appeler des fonctions non mappées (telles que GetItems) dans une requête LINQ to SQL.

+0

Avez-vous un meilleur moyen? – ari

0

Le fonct. GetItems devrait être correct dans une requête linqtoSql car il renvoie lui-même un IQueryable. Si c'était un problème, vous obtiendrez probablement une exception "non supporté" au lieu de celle que vous obtenez. Mais il semble que ce que vous voulez réellement est une liste de tous les ID de produit avec leurs quantités associées résumées. Si c'est le cas, je pense que vous devriez utiliser le groupe linq à la place. Pour autant que je sache, vous pouvez écrire ce que vous essayez de faire dans une seule requête comme ceci:

var x = from p in _db.ProposaItems 
     group p by p.ProposaID into g 
     select new 
     { 
      ID = g.Key, 
      TotalQuantity = g.Sum(c => c.Quantity) 
     }; 
Questions connexes