0

基本的に、次のようなループがあります。

foreach(var file in files)
{
    // ...
    db.Images.Add(new ImageFingerPrint { FileName = file, FingerPrint = fingerprint });
}

int recordsAffected = db.SaveChanges();

FileNamePKです。FingerPrintDBにすでに存在する場合は、代わりに更新したいだけです。基本的にREPLACEを行っていると思います。

それが簡単/不可能な場合は、テーブル全体を単純に切り捨てるにはどうすればよいですか?

4

2 に答える 2

2

テーブルを切り捨てることができます

db.Images.Clear();
db.SaveChanges();

外部キー制約がないと仮定します。

既存のアイテムを取得する場合は、LINQ クエリを試してください。

var existing = (from im in db.Images
               where im.FileName.Equals(file)
               select im).SingleOrDefault();
if(existing != null)
    existing.FingerPrint = fingerprint;
else
    db.Images.Add(...)
db.SaveChanges();
于 2012-04-22T19:06:10.013 に答える
2

私がよく使うパターンは

foreach(var file in files)
{
    var image = db.Images.SingleOrDefault(i => i.FileName == file);
    if (item == null)
    {
        image = new ImageFingerPrint() { FileName = file };
        db.Images.Add(image);
    }

    image.FingerPrint = fingerprint;
}    
db.SaveChanges();

IDENTITYこれは、主キー、CreatedDate列、タイムスタンプなど、データベースで生成されたフィールドがオブジェクトにある場合に簡単になります。これらのフィールドがデフォルトであるかどうかを確認するのは簡単です。それらがデフォルトである場合、オブジェクトは新規であり、「追加」する必要があります。

ループの複雑さに応じて、「既存の」ファイル名と「新しい」ファイル名を前もって決定したい場合があります-

var existing = files.Where(f => db.Images.Contains(f)); 
// & use .ToList() if you're going to be iterating the collection multiple times

foreach (file in existing)
{
    // updates
}

foreach (var file in files.Except(existing))
{
    // inserts
}

私はこのアプローチを、パフォーマンス上の利点がある場合に使用します。たとえば、操作の 1 つを一括操作として実行でき、もう 1 つを実行できない場合などです。それ以外の場合は、挿入操作と更新操作が大幅に異なる場合、コードをより明確にすることができます。

于 2012-04-22T22:59:46.157 に答える