3

重複を見つける必要がある 50 万件のレコード テーブルがあります。だから私は私が作成したこのコードを使用します:

var dups2 = from m in mg_B
    group m by new { m.Addr1, m.Addr2, m.City, m.State }
    into g
    where g.Count() > 1
    select g;

このコードの問題は、addr1 が空の文字列 "" とそれぞれ NULL である 2 つのレコードを重複として認識しないことです。

基本的に、フィールドの null と空の値を比較すると、それらは異なると見なされますが、同じと見なされる必要があります。

すべてのレコードを調べて、null 値を "" に置き換えることができることはわかっていますが、コンピューターが 4000 レコードを処理するのに 1 分かかりました。これは、誰かがボタンをクリックすると繰り返し実行されます。

最初にいくつかのフィールド (テーブルには 40 以上のフィールドがあります) を持つクラスを作成したため、この null 空文字列の問題について知りました。

List<CombineClass> mg = (from m in db.MG_Backup
   where m.IsArchived == false
   select new CombineClass { id = m.ID, name = m.Name, addr1 = string.IsNullOrEmpty(m.Addr1) ? "" : m.Addr1, addr2 = string.IsNullOrEmpty(m.Addr2) ? "" : m.Addr2, city = m.City, state = m.State }).ToList(); 

何か案は ?

4

2 に答える 2

3

このバージョンは、Linq-to-Sql / Linq-to-Entities と互換性があります

var dups2 = from m in mg_B
    group m by new 
    { 
        Addr1 = m.Addr1 ?? string.Empty, 
        Addr2 = m.Addr2 ?? string.Empty, 
        City  = m.City ?? string.Empty, 
        State = m.State ?? string.Empty,
    }
    into g
    where g.Count() > 1
    select g;

生成された sql は次のようになります。

-- Parameters
DECLARE @p0 NVarChar(1000) = ''
DECLARE @p1 NVarChar(1000) = ''
DECLARE @p2 NVarChar(1000) = ''
DECLARE @p3 NVarChar(1000) = ''
DECLARE @p4 Int = 1

SELECT [t2].[value2] AS [Addr1], [t2].[value22] AS [Addr2], [t2].[value3] AS [City], [t2].[value3] AS [State]
FROM (
    SELECT COUNT(*) AS [value], [t1].[value] AS [value2], [t1].[value2] AS [value22], [t1].[value3], [t1].[value4]
    FROM (
        SELECT COALESCE([t0].[Addr1],@p0) AS [value], COALESCE([t0].[Addr2],@p1) AS [value2], COALESCE([t0].[City],@p2) AS [value3], COALESCE([t0].[State],@p3) AS [value4]
        FROM [SettingSystemNodes] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value], [t1].[value2], [t1].[value3], [t1].[value4]
    ) AS [t2]
WHERE [t2].[value] > @p4

string.Emptyクエリの前にローカル変数を設定した場合、またはletクエリ内の変数に設定した場合でも、空の文字列に使用されるパラメーターは 1 つだけであることに注意してください。

于 2013-04-03T15:24:05.200 に答える