2016-04-05 32 views
0

新しい製品を挿入する前に、その値がデータベースに既に存在するかどうかを確認したいと思います。いくつかのフィールドにはnullとfalseの値があります。いくつかのフィールドでExistsレコードを確認する方法 - Entity Framework

私はこのような方法で作成しました:

public bool IsExists(Guid warrantyId, bool hasColor, Guid? colorId, bool hasSize, Guid? sizeId) 
{ 
    return _products.Any(row => (hasColor && row.ColorId.Value == colorId.Value) && (hasSize && row.SizeId.Value == sizeId.Value) && row.WarrantyId == warrantyId); 
} 

を、それは常にfalseを返します。

私はこの部分

row.WarrantyId == warrantyId 

を削除すると、それが正常に動作します。私はそれをどうやって確認できるのか分からない。ここ

は私のデータベース内にいくつかのデータです:

enter image description here

私はこの方法には、この項目を渡さ:

warrantyId:F1F2D639-22AF-618A-7422-4122BB38D545 

hascolor:true , ColorId: 47f3d639-18de-5d26-91f7-0cd4465a161a 

HasSize:false and SizeId:null 

その戻り偽。

私はこのような方法を書き直しても問題ありません。

public bool IsExists(Guid warrantyId, bool hasColor, Guid? colorId, bool hasSize, Guid? sizeId) 
    { 
     var result = _products.Where(row => row.WarrantyId == warrantyId).AsQueryable(); 
     if (hasColor) 
      result = result.Where(row => row.ColorId.Value == colorId.Value).AsQueryable(); 
     else 
      result = result.Where(row=>row.HasColor==false).AsQueryable(); 
     if (hasSize) 
      result = result.Where(row => row.SizeId.Value == sizeId.Value).AsQueryable(); 
     else 
      result = result.Where(row => row.HasSize == false).AsQueryable() ; 

     return result.Any(); 

    } 
+0

あなたは何を試そうとしていますか? 'true'を返すデータベース行とパラメータの値を表示する –

+0

@StephenMuecke申し訳ありませんが、私のコードとその誤りをデバッグできますか? –

+0

「真実」を返すと期待しているデータの例を挙げない限り、おそらく助けてくれるかもしれません。 –

答えて

1

Stephen Mueckeはコメントに指摘したとおり、データベースには探している行がありません。また、私が間違っていない場合、NULLsizeId.Valueは、row.SizeId.Valueがデータベース内の場合にもtrueを返します(nullではありません)。

多くの検索を実行することがわかっている場合は、複数の列に基づいて存在を確認することをお勧めします。ただし、この方法では表の変更が必要です。新しい列EntryHashを導入する必要があります。これは、他の列の値のハッシュ計算です。ユニークな値のセットのみを必要とする場合は、Uniqueにしてください。そうでなければ、とにかくインデックスを作成してください。考え方は、クエリが単一の列のみで実行されることです。これは高速になります。ここでは、ハッシュを計算するための提案された方法(無効化された値に注意を払う)があります。

public static string CreateEntryHash(Guid warrantyId, bool hasColor, Guid? colorId, bool hasSize, Guid? sizeId) 
{ 
    var sb = new StringBuilder(); 
    sb.Append(warrantyId); 
    sb.Append(hasColor); 
    sb.Append(colorId == null ? "null" : colorId.ToString()); 
    sb.Append(hasSize); 
    sb.Append(sizeId == null ? "null" : sizeId.ToString()); 

    var hash = GetMd5Hash(sb.ToString()); 

    return hash; 
} 

public static string GetMd5Hash(string input) 
{ 
    StringBuilder sBuilder = new StringBuilder(); 
    using (MD5 md5Hash = MD5.Create()) 
    { 
     byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); 
     for (int i = 0; i < data.Length; i++) 
     { 
      sBuilder.Append(data[i].ToString("x2")); 
     } 
    } 

    return sBuilder.ToString(); 
} 

public bool IsExists(Guid warrantyId, bool hasColor, Guid? colorId, bool hasSize, Guid? sizeId) 
{ 
    var hash = CreateEntryHash(warrantyId, hasColor, colorId, hasSize, sizeId); 
    return _products.Any(p => p.EntryHash == hash); 
} 
関連する問題