2010-05-07 6 views
0

Nous avons ce code:traduction non pris en charge pour SQL

private IList<InfoRequest> GetBy(Func<InformationRequest, string> func, string searchby) 
{ 
    var requests = _dc.InformationRequests 
         .Where(x => func.Invoke(x).Contains(searchby)) 
         .OrderBy(y => y.RequestDate); 

    return Mapper.Map<InformationRequest[], InfoRequest[]>(requests.ToArray()); 
} 

Il continue de lancer la traduction ne prise en charge d'une erreur SQL. Des idées sur le problème ou comment le résoudre?

+0

Contient est pris en charge, mais votre func est pas. Fournissez plus d'informations sur ce que vous essayez de faire avec Func. C'est ton problème. Linq to SQL ne peut pas pousser une Expression vers le bas. – Nix

Répondre

0

Je prendrais le conseil trouvé dans ce link, Convertissez votre func à une expression et qui résultera en une méthode .Where differnt surchargée.

private IList<InfoRequest> GetBy(Expression<Func<InformationRequest, string>> exp, string searchby) 
{ 

     var requests = _dc.InformationRequests 
        .Where(x => exp(x).Contains(searchby)) 
+0

Ouais j'ai essayé celui-là aussi. Cela ne me donne pas l'option de passer dans la demande d'information. Je devrais faire ceci: .Where (x => exp.Compile(). Invoke (x) .Contains (searchby)) À ce stade, il donne la même erreur qu'avant. – derans

+0

pouvez-vous s'il vous plaît poster votre func ci-dessus? – Nix

0

J'ai fini avec ceci:

private static Expression<Func<T, bool>> StartsWith<T>(Func<string, string> func) 
{ 
    var searchBy = func.Method.GetParameters()[0].Name; 
    var search = Expression.Constant(func(null), typeof(string)); 

    var searchByParam = Expression.Parameter(typeof(T), searchBy); 
    var searchByExp = Expression.Property(searchByParam, searchBy); 

    var methodInfo = typeof(string).GetMethod("StartsWith", new[] { typeof(string) });//, typeof(StringComparison)}); 
    var containsExpression = Expression.Call(searchByExp, methodInfo, search); 

    return Expression.Lambda<Func<T, bool>>(containsExpression, searchByParam); 
} 

Si vous voulez plus de détails, je blogué ici: http://derans.blogspot.com/2010/05/building-l2s-expression-with-net-35.html

Questions connexes