Si vous devez utiliser seulement DataContext
, alors vous pouvez construire l'expression manuellement. Dans ce cas, je suis en utilisant une expression de sélection, mais la réflexion sur une propriété nom (par exemple « Nom ») ferait tout aussi bien:
static void Main()
{
string knownName;
using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
knownName = ctx.Customers.First().CompanyName;
}
using (DataContext ctx = new DataClasses1DataContext())
{
Console.WriteLine(ctx.Any<Customer, string>(
cust => cust.CompanyName, "none-such"));
Console.WriteLine(ctx.Any<Customer, string>(
cust => cust.CompanyName, knownName));
}
}
static bool Any<TEntity, TValue>(
this DataContext ctx,
Expression<Func<TEntity, TValue>> selector,
TValue value)
where TEntity : class
{
var lambda =
Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
selector.Body,
Expression.Constant(value, typeof(TValue))),
selector.Parameters);
return ctx.GetTable<TEntity>().Any(lambda);
}
L'approche basée sur la chaîne serait:
using (DataContext ctx = new DataClasses1DataContext())
{
Console.WriteLine(ctx.Any<Customer, string>("CompanyName", "none-such"));
Console.WriteLine(ctx.Any<Customer, string>("CompanyName", knownName));
}
...
static bool Any<TEntity, TValue>(
this DataContext ctx,
string propertyOrFieldName,
TValue value)
where TEntity : class
{
var param = Expression.Parameter(typeof(TEntity), "row");
var lambda =
Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, propertyOrFieldName),
Expression.Constant(value, typeof(TValue))),
param);
return ctx.GetTable<TEntity>().Any(lambda);
}
Vous dites "ce qui se passe est l'utilisateur tape le même nom et j'ai besoin de voir si c'est dans la base de données", mais ajoutez le commentaire "Je ne veux pas aller et spécifier (CompanyName)" ... donc: puisque je ne pense pas que nous parlons de la clé primaire, comment voulez-vous que le système sache quelle colonne vous voulez comparer pour l'égalité? –