2009-06-09 5 views
0

Quelle serait la meilleure façon de vérifier si un enregistrement existe dans une table. Ce qui se passe est que l'utilisateur tape le même nom et j'ai besoin de voir s'il se trouve dans la base de données. La chose est que je voudrais le faire sur la classe de base Repository qui utilise des génériques. Donc, je ne peux pas aller Entity.Name.Linq2SQL et les enregistrements en double

public void Save(T item) 
     { 
      Table<T> table = _db.GetTable<T>(); 
      table.InsertOnSubmit(item); 
      _db.SubmitChanges(); 
     } 

Cela ne fonctionnera pas comme les articles est pas exactement les mêmes

if (!table.Contains(item)) 
      { 
       table.InsertOnSubmit(item); 
      } 

Merci

+0

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é? –

Répondre

0

Cela vous donnera une collection des membres d'identité, vous pouvez faire une vérification sur la clé primaire de votre article est contenu dans la collection

_db.Mapping.GetTable(T).RowType.IdentityMembers 
+0

_db.Mapping.GetTable (T) .RowType.IdentityMembers cela ne fonctionnera pas 'T' est un 'paramètre de type' mais est utilisé comme une 'variable' –

+0

et pourquoi? _db.Mapping.GetTable (item.GetType()). RowType.IdentityMembers –

0

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); 
} 
+0

Marc la chose est que je ne veux pas y aller et spécifier (CompanyName) –

Questions connexes