J'utilise Entity Framework et je développé cette méthode d'extension:Essayer de développer une nouvelle méthode d'extension
public static IQueryable<TResult> Like<TResult>(this IQueryable<TResult> query, Expression<Func<TResult, string>> field, string value)
{
var expression = Expression.Lambda<Func<TResult, bool>>(
Expression.Call(field.Body, typeof(string).GetMethod("Contains"),
Expression.Constant(value)), field.Parameters);
return query.Where(expression);
}
ce code fonctionne correctement si je l'utilise comme ceci:
var result = from e in context.es.Like(r => r.Field, "xxx")
select e
maintenant J'ai besoin d'appeler cette méthode d'extension par programme:
public static IQueryable<TSource> SearchInText<TSource>(this IQueryable<TSource> source, string textToFind)
{
// Collect fields
PropertyInfo[] propertiesInfo = source.ElementType.GetProperties();
List<string> fields = new List<string>();
foreach (PropertyInfo propertyInfo in propertiesInfo)
{
if (
(propertyInfo.PropertyType == typeof(string)) ||
(propertyInfo.PropertyType == typeof(int)) ||
(propertyInfo.PropertyType == typeof(long)) ||
(propertyInfo.PropertyType == typeof(byte)) ||
(propertyInfo.PropertyType == typeof(short))
)
{
fields.Add(propertyInfo.Name);
}
}
ParameterExpression parameter = Expression.Parameter(typeof(TSource), source.ElementType.Name);
Expression expression = Expression.Lambda(Expression.Property(parameter, typeof(TSource).GetProperty(fields[0])), parameter);
Expression<Func<TSource, string>> field = Expression.Lambda<Func<TSource, string>>(expression, parameter);
return source.Like(field, textToFind);
}
Maintenant, ce code ne fonctionne pas! J'ai besoin de comprendre comment déclarer le "champ" des méthodes étendues Like.
Expression<Func<TSource, string>> field = Expression.Lambda<Func<TSource, string>>(expression, parameter);
Lors de l'exécution, je reçois cette erreur: Impossibile utilizzare un'espressione di tipo 'System.Func`2 [TestMdf.Equipment, System.String]' par un tipo restituito 'System.String'
Je suis un peu confus par votre deuxième méthode d'extension. Vous parcourez tous les PropertyInfo sur l'élément, les ajoutez à un ensemble de champs, puis choisissez le premier. Cela semble vraiment vague et non ciblé ... très susceptible de retourner des résultats aléatoires. Avant que je fournisse n'importe quelle sorte de réponse ... est-ce que c'est ce que tu veux? Ou avez-vous vraiment besoin de choisir une propriété spécifique à rechercher ... ou avez-vous besoin de faire défiler toutes les propriétés et d'appeler .Like() pour chacune d'entre elles et agréger les résultats? – jrista
Salut, vous avez raison sur la boucle ... La version finale de cette méthodes étendues générera plusieurs clause Where. Dans l'exemple, vous avez les champs F1, F2, F3 qui sont des nombres ou des chaînes Je voudrais rechercher dans le texte comme ceci: '' + F1 + '' + F2 + '' + F3 + '' LIKE ' % Mais sera plus compliqué à nouveau ... Je voudrais ajouter un peu de moteur de recherche donc: '' + F1 + '' + F2 + '' + F3 + '' LIKE '% % ' ET' '+ F1 +' '+ F2 +' '+ F3 +' 'LIKE'% % ' ET' '+ F1 +' '+ F2 +' '+ F3 +' 'N'EST PAS'% % ' et gérer les phrases aussi. –