Pour un projet utilisant LINQ to Entities 4.0, j'ai un paramètre dans lequel je dois retourner une requête avec une valeur (constante) ajoutée au préalable. Si je l'étais le codage dans SQL, il ressemblerait à quelque chose comme ceci:Comment créer une méthode d'extension Prepend pour IQueryable <T> qui est compatible avec Linq to Entities 4.0?
select 0 as ID, 'default' as Name
union
select ID, Name from X
Pour ce projet, je voudrais créer une méthode d'extension générique IQueryable qui accepte une valeur constante renvoie une requête avec la valeur constante préfixé comme son résultat. Le processus ne doit pas déclencher l'énumération, car je ne souhaite pas que la requête déclenche un accès à la base de données à moins que l'autre code de l'application n'énumère la requête.
Idéalement, j'aimerais que le résultat IQueryable puisse être joint à d'autres requêtes Linq to Entities et traité par le fournisseur L2E.
J'ai essayé quelques variantes, mais je me suis rendu compte qu'elles allaient déclencher l'énumération au lieu d'ajouter à la requête. Ma dernière tentative étend la requête sans l'énumération (comme on le souhaite), mais renvoie une erreur.
public static IQueryable<T> Prepend<T>(
this IQueryable<T> query
, T value
)
{
return query
.Where(t => false).DefaultIfEmpty(value)
.Concat(query);
}
L'erreur est, « Impossible de créer une valeur constante de type « OCEAN.Business.Pocos.ExclusionIncomeType » Seulement primitive types ('tels que Int32, String et Guid') sont pris en charge dans ce contexte. ".
J'ai essayé de rechercher des concepts similaires, y compris l'ajout d'une valeur, mais en vain.
Des idées?
Avez-vous essayé d'utiliser un 'Union' réelle? 'query.Union (new [] {valeur})'? Je sais que Linq-to-SQL n'aime pas ça, mais peut-être que Linq-to-Entities peut le gérer? – bdukes