2009-06-09 10 views
0

レコードがテーブルに存在するかどうかを確認する最も良い方法は何でしょうか。何が起こるかは、ユーザーが同じ名前を入力し、それがデータベースにあるかどうかを確認する必要があります。私がジェネリックスを使用するリポジトリベースクラスでやりたいことです。だから私はEntity.Nameに行くことができません。Linq2SQLと重複レコード

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

これはアイテムとして動作しません。これは、あなたが主キーにチェックを行うことができますアイデンティティのメンバーのコレクションを与えるまったく同じ

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

おかげ

+0

あなたは「ユーザーが同じ名前を入力して、データベースにあるかどうかを確認する必要がありますが、次にコメントを追加してください」と言うと、だから私は主キーについて話しているとは思っていないので、どの列を平等のために比較したいのかをシステムに知らせたいのですか? –

答えて

0

ではありませんあなたの商品のコレクションはコレクションに含まれています

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

_db.Mapping.GetTable(T).RowType.IdentityMembersこれは動作しません 'T'は 'タイプパラメータ'ですが、 '変数'のように使用されます –

+0

ではどうですか? _db.Mapping.GetTable(item.GetType())。RowType.IdentityMembers –

0

DataContextを使用すると、式を手動で構築できます。この場合、私は、セレクタ式を使用していますが、プロパティ名(つまり、「名前」)での反射は全く同じように行うだろう:

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

文字列ベースのアプローチは次のようになります。

+0

Marcは、私は行かないで指定したい(CompanyName) –

関連する問題