0

私は、過去 10 年間一緒にハッキングされてきたプロジェクトの真っ只中に放り込まれました。お知らせしておくと、開発を続ける前に、データベースをリファクタリングしてシステムのアーキテクチャ設計を確認できるかどうかを既に提案し、尋ねましたが、現在のシステムの欠陥を修正するよりも、複数の小規模なプロジェクトの成果物が「より重要」です。 .

そうは言っても、完全に一致する場合にコードをチェックインする最良の方法は何ですか?

このテーブルには 75 列、200 万行以上あるとします。

私はできることを知っています:

var foo = bar.GetNewDocument();
dbContext.documents.Count(p => p.firstCol == foo.firstCol
                            && p.secondCol == foo.secondCol
                            && etc, etc);

これは明らかに最善の解決策ではありません...コード内のこの新しいエントリを残りのエントリと比較して一致を確認するより良い方法はありますか?

4

2 に答える 2

0

SQLクエリを作成したい場合は、式を構築する必要があります。例えば:

    public static Expression<Func<T, bool>> GetEqualsExpression<T>(T obj)
    {
        var type = typeof (T);

        var x = Expression.Parameter(type, "x");

        BinaryExpression body = null;
        foreach (var propertyInfo in type.GetProperties())
        {
            var left = Expression.Property(x, propertyInfo);
            var right = Expression.Constant(propertyInfo.GetValue(obj, null));
            var equalsExpression = Expression.Equal(left, right);

            body = body == null ? equalsExpression : Expression.AndAlso(body, equalsExpression);
        }

        return Expression.Lambda<Func<T, bool>>(body, x);
    }

使用法

        var foo = bar.GetNewDocument();
        var expression = GetEqualsExpression(foo);
        dbContext.documents.Count(expression);
于 2013-04-16T20:16:06.893 に答える
0

を使用HashSet<int>して、ドキュメント クラスにカスタム ハッシュ メソッドを記述します。

HashSet<int> hashes...;
dbContext.documents.ToList().ForEach(d=>{
  if (hashes.Contains(d.GetHash()))
    Console.WriteLine("Found one: "+d); // do further comparison here to ensure it's not hash collision
  else
    hashes.Add(d.GetHash());
});

dbContext.documents のエントリが多すぎる場合は、使用する必要があり、ToList が一度にすべてをプルダウンしforeachないことに注意してください。.ToList

.ToList()また、使用しないで直接使用しようとすると、ハッシュ メソッドにアクセスできなくなります。たとえば、 dbContext.documents.Any(d=>d.GetHash()...)SQL に変換できないため、これは機能しません。

この操作が非常に頻繁に実行される場合は、(!) ハッシュを保持する別の列を追加する (またはそれを保持するテーブルを追加する) ことができます。これにより、繰り返しチェックするためのオーバーヘッドが非常に最小限になります。SQLServer は、インデックス付きで 200 万行をチェックできます非常に、非常に迅速にカラムトします。

于 2013-04-16T19:10:30.710 に答える