回答:
SQLを直接実行したくない場合、最善の方法はAny()を使用することです。これは、Any()が一致を見つけるとすぐに戻るためです。別のオプションはCount()ですが、戻る前にすべての行をチェックする必要がある場合があります。
これを使用する方法の例を次に示します。
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
そして、vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
あるインターフェイスに制約し、IEnumerable
それを含むオブジェクトを返すId
場合、ジェネリック関数を使用できるはずIsExists<T>()
です。
新しいデータレコードで提供される重複の割合が非常に高く、重複をチェックするために何千ものデータベース呼び出しが行われるシナリオを管理する必要がありました(そのため、CPUは100%で多くの時間を送信しました)。最後に、メモリにキャッシュされた最後の100,000レコードを保持することにしました。このようにして、SQLデータベースに対するLINQクエリと比べて非常に高速なキャッシュされたレコードに対して重複をチェックし、真に新しいレコードをデータベースに書き込むことができます(データキャッシュにレコードを追加することもできます)。長さを管理しやすいようにソートおよびトリミングされます)。
生データは、解析が必要な多数の個別のレコードを含むCSVファイルであったことに注意してください。連続する各ファイル(5分ごとに約1の割合で来た)のレコードはかなり重複しており、重複の割合が高くなっています。
要するに、入ってくる生データにかなり順番にタイムスタンプを付けた場合、メモリキャッシュを使用すると、レコードの重複チェックに役立つ場合があります。
私はこれが非常に古いスレッドであることを知っていますが、私のような誰かがこのソリューションを必要とする場合に備えて、VB.NETで上記の答えに基づいて使用したものをここに示します。
Private Function ValidateUniquePayroll(PropertyToCheck As String) As Boolean
// Return true if Username is Unique
Dim rtnValue = False
Dim context = New CPMModel.CPMEntities
If (context.Employees.Any()) Then ' Check if there are "any" records in the Employee table
Dim employee = From c In context.Employees Select c.PayrollNumber ' Select just the PayrollNumber column to work with
For Each item As Object In employee ' Loop through each employee in the Employees entity
If (item = PropertyToCheck) Then ' Check if PayrollNumber in current row matches PropertyToCheck
// Found a match, throw exception and return False
rtnValue = False
Exit For
Else
// No matches, return True (Unique)
rtnValue = True
End If
Next
Else
// The is currently no employees in the person entity so return True (Unqiue)
rtnValue = True
End If
Return rtnValue
End Function
私はこれに問題がありました-私のEntityKeyは3つのプロパティ(3列のPK)で構成されており、醜いので各列をチェックしたくありませんでした。すべてのエンティティで常に機能するソリューションについて考えました。
これのもう1つの理由は、毎回UpdateExceptionsをキャッチしたくないからです。
キープロパティの値を取得するには、少しのReflectionが必要です。
コードは、次のように使用を簡略化する拡張機能として実装されます。
context.EntityExists<MyEntityType>(item);
見てください:
public static bool EntityExists<T>(this ObjectContext context, T entity)
where T : EntityObject
{
object value;
var entityKeyValues = new List<KeyValuePair<string, object>>();
var objectSet = context.CreateObjectSet<T>().EntitySet;
foreach (var member in objectSet.ElementType.KeyMembers)
{
var info = entity.GetType().GetProperty(member.Name);
var tempValue = info.GetValue(entity, null);
var pair = new KeyValuePair<string, object>(member.Name, tempValue);
entityKeyValues.Add(pair);
}
var key = new EntityKey(objectSet.EntityContainer.Name + "." + objectSet.Name, entityKeyValues);
if (context.TryGetObjectByKey(key, out value))
{
return value != null;
}
return false;
}
オブジェクトがnullかどうかを確認するだけで、100%機能します
try
{
var ID = Convert.ToInt32(Request.Params["ID"]);
var Cert = (from cert in db.TblCompCertUploads where cert.CertID == ID select cert).FirstOrDefault();
if (Cert != null)
{
db.TblCompCertUploads.DeleteObject(Cert);
db.SaveChanges();
ViewBag.Msg = "Deleted Successfully";
}
else
{
ViewBag.Msg = "Not Found !!";
}
}
catch
{
ViewBag.Msg = "Something Went wrong";
}
やってみませんか?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
オブジェクトが何であるか、データベースのどのテーブルに関係なく、必要なのはオブジェクトの主キーだけです。
var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue == null)
{
Don't exist
}
Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue Is Nothing Then
Don't exist
End If