2012-01-24 3 views
0

J'ai la requête LINQ suivante -requête Linq ne me laisse pas pour une date

var data = (from req in db.tblRequirements 
     where req.guidRequirementId == guidRequirementId 
      && (!db.ViewMIPRAlls.Any(x=>x.guidRequirementId == req.guidRequirementId)) 
     select new 
     { 
      guidRequirementId = req.guidRequirementId, 
      strStatus = req.tblCodesRequirementStatus.strDescription, 
      strNumber = req.ViewNumber.strAwardNumber, 
      strOffice = req.tblOrganization.strAcronym, 
      strCustomerOffice = req.tblOrganizationCustomer.strAcronym, 
      strDescription = req.strDescription, 
      strNotes = req.strNotes, 
      strStatusId = req.strStatusId, 
      strCompany = req.strCompany, 
      strUpdatedBy = Person.GetPersonNameFromUserID(req.guidUserId), 
      dtmUpdated = Requirement.UpdateTime(req.guidRequirementId), 
      dtmEsitmatedEnd = (req.tblDates.Select(x=>x.dtmEnd) != null 
       ? req.tblDates.Select(x=>x.dtmEnd.ToShortDateString()).ToString() 
       : "" 
      ) 
     }).OrderBy(x=>x.dtmEnd); 

et je suis incapable de le commander par date. Ce résultat de la requête dans l'erreur suivante:

Could not format node 'ClientQuery' for execution as SQL.

+2

Quel fournisseur LINQ? LINQ to SQL, LINQ to Entités? Autre chose? – Yuck

+0

LINQ to SQL désolé – EvanGWatkins

Répondre

4

Soit Orderby Avant la sélection, ou Orderby par quelque chose que vous avez créé dans la sélection

+0

Lorsque je mets l'ordre avant le nouveau je reçois l'erreur suivante: Impossible de classer par type 'System.Collections.Generic.IEnumerable'1 [System.DateTime]'. – EvanGWatkins

+0

hmmm, essayez de faire .ToList(). OrderBy (x => x.dtmEnd) .select (... –

+0

(cela signifie que votre application va faire la commande au lieu de la base de données) –

3

La clause OrderBy devrait venir avant la select new si vous essayez de trier par des champs dans SQL.

Votre déclaration LINQ pourrait être transformé en:

var data = 
    from req in db.tblRequirements 
    from dates in req.tblDates 
    where req.guidRequirementId == guidRequirementId 
     && (!db.ViewMIPRAlls.Any(x=>x.guidRequirementId == req.guidRequirementId)) 
    order by dates.dtmEnd 
    select new 
    { 
     guidRequirementId = req.guidRequirementId, 
     strStatus = req.tblCodesRequirementStatus.strDescription, 
     strNumber = req.ViewNumber.strAwardNumber, 
     strOffice = req.tblOrganization.strAcronym, 
     strCustomerOffice = req.tblOrganizationCustomer.strAcronym, 
     strDescription = req.strDescription, 
     strNotes = req.strNotes, 
     strStatusId = req.strStatusId, 
     strCompany = req.strCompany, 
     strUpdatedBy = Person.GetPersonNameFromUserID(req.guidUserId), 
     dtmUpdated = Requirement.UpdateTime(req.guidRequirementId), 
     dtmEsitmatedEnd = (req.tblDates.Select(x=>x.dtmEnd) != null 
      ? req.tblDates.Select(x=>x.dtmEnd.ToShortDateString()).ToString() 
      : "" 
     ) 
    } 

S'il vous plaît noter que, selon le type de relation entre tblRequirements et tblDates, cela peut produire plus d'enregistrements que votre sélection initiale. Pour surmonter cela, vous aurez besoin de penser à une façon de regrouper les enregistrements tblDates correspondant à un tblRequirements enregistrement (? Peut-être juste prendre max(tblDates.dtmEnd))

+0

Lorsque je mets la commande avant le nouveau select, j'obtiens l'erreur suivante: Impossible de classer par type 'System.Collections.Generic.IEnumerable'1 [System.DateTime]'. – EvanGWatkins

+0

@EvanGWatkins C'est parce que vous avez sélectionné 'tblRequirements', mais que vous avez choisi un champ dans' tblDates'. Vous devez également avoir 'tblDates' dans la clause' from' (en le rejoignant peut-être avec l'autre table). – GolfWolf

0

Essayez:

where req.guidRequirementId == guidRequirementId 
     && (!db.ViewMIPRAlls.Any(x=>x.guidRequirementId == req.guidRequirementId)) 
order by req.dtmEnd  
select new 
Questions connexes