0
votes

Efficacité LINQ

Considérez les instructions LINQ suivantes:

var model = getModel();

// apptId is passed in, not the order, so get the related order id
var order = (model.getMyData
    .Where(x => x.ApptId == apptId)
    .Select(y => y.OrderId));

var orderId = 0;

var orderId = order.LastOrDefault();

// see if more than one appt is associated to the order
var apptOrders = (model.getMyData
    .Where(x => x.OrderId == orderId)
    .Select(y => new { y.OrderId, y.AppointmentsId }));


8 commentaires

prochirection de VAR = 0; foreach (point variable dans l'ordre) {orderid = élément; } pourrait être remplacé par Varchechard = ordre.lastopefault (); .


@mjwills belle prise.


@Gurustron Question mise à jour. GetMyData est une table du magasin de données.


Mais si vous avez deux commandes ou plus avec le même app stdid comment définissez-vous laquelle de ces commandes est la dernière? Sans une ordonnance, vous quittez cette décision de la manière dont votre dB récupère les commandes.


Quel est votre ormes? Cadre d'entité?


@Markuzy oui tristement nous sommes toujours sur ef4


@Steve Appids sont uniques. Une commande peut avoir plus d'un app apttid associé à celui-ci. Et dans mon cas, je n'ai qu'un app apttid, je dois donc rechercher l'ordre d'abord et voir si plusieurs appceptides sont associés.


Qu'est-ce que ApppointsPointsId et est-il lié à APPTID ?


3 Réponses :


-2
votes

On dirait que ceci est tout ce dont vous avez besoin: xxx


3 commentaires

Non, j'ai besoin de tous ceux qui partagent la même commande. Je n'ai pas la commande accessible à ce stade, c'est pourquoi je le regarde d'abord.


@Neo - Oui, mais vous faites cela via le APPTID . Cela vous semble toujours équivalent à celui du code de votre question.


Votre réponse suppose que toutes les données avec un APTID ont également tous les mêmes OrderID , je doute fort que c'est le cas



0
votes

Vous pouvez utiliser la méthode de groupeby pour regrouper toutes les commandes par OrderID. Après avoir postulé sur LastOrdefault et Tolist vous donnera le même résultat que vous obtenez du code ci-dessus.

Voici un code d'exemple: p>

 var apptOrders = model.getMyData
    .Where(x => x.ApptId == apptId)
    .GroupBy(s => s.OrderId)
    .LastOrDefault().ToList();


3 commentaires

Initialement, je n'ai pas d'identifiant de commande.


Cela fait la même chose que vous faites dans votre code. Il filtration des ordres par l'APPTID donné, puis le regroupant par l'ID de commande et de prendre des commandes de la dernière commande.


Ah, j'ai raté le groupement par ordeid. Je vais tester cela dans un peu.



0
votes

Framework d'entité ne peut pas traduire lastordrefault code>, mais il peut gérer contient code> avec des sous-requêtes, donc consultez le code code> comme requête et Filtrer les commandes à cet effet:

// apptId is passed in, not the order, so get the related order id
var orderId = model.getMyData
                   .Where(x => x.ApptId == apptId)
                   .Select(y => y.OrderId);

// see if more than one appt is associated to the order
var apptOrders = model.getMyData
                      .Where(a => orderId.Contains(a.OrderId))
                      .Select(a => a.ApptId);


0 commentaires