2010-09-01 6 views
2

J'ai un cas d'utilisation relativement simple qui échoue. Considérez le code suivant:LINQ + WCF + Transactions

[OperationBehavior(TransactionScopeRequired = true)] 
public IEnumerable<StatusRecord> ReadActive(int contactID, bool isActive) 
{ 
    var result = from n in ORM.Default.Table<StatusRecord>() 
       where n.lng_contact_id == contactID && n.dte_effective_end == null 
       select n; 

    return result; 
} 

Ceci utilise un fournisseur LINQ-SQL personnalisé de nos propres origines maléfiques. Normalement, ce type d'appel fonctionne très bien, mais lorsqu'il est utilisé à partir d'un appel WCF DTC Transacted, il se bloque. Ma théorie est que la sérialisation du résultat dans un tableau se produit en quelque sorte en dehors de la portée de la transaction et se bloque donc. De plus, ma théorie est étayée par le fait que la modification de la ligne

return result; 

à

return result.ToArray(); 

fait les choses fonctionnent. Bien que je suis heureux d'avoir une solution de contournement, il semble qu'il existe une meilleure façon d'obtenir ce comportement. S'il vous plaît donnez votre avis. Je vous remercie! N'utilisez pas l'exécution deffered dans l'opération WCF

+0

Vous souhaitez matérialiser (ToList()/ToArray() etc) votre requête avant de la renvoyer à votre client WCF? – StuartLC

Répondre

1

Vous devez exécuter votre requête avant de renvoyer le résultat - c'est ce que vous avez fait dans result.ToArray().

+0

Je vous suis, mais sans transactions différées l'exécution fonctionne bien. WCF auto aplatit/sérialise/matérialise (quel que soit le mot exact) énumérations - espérait que je pourrais le faire ici aussi. – Malachi