Câu trả lời:
Nếu bạn không muốn thực thi SQL trực tiếp, cách tốt nhất là sử dụng Any () . Điều này là do Any () sẽ trả về ngay sau khi nó tìm thấy một kết quả phù hợp. Một tùy chọn khác là Count () , nhưng tùy chọn này có thể cần phải kiểm tra mọi hàng trước khi trả về.
Đây là một ví dụ về cách sử dụng nó:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Và trong vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
với một giao diện có IEnumerable
và trả về các đối tượng có chứa một Id
, bạn sẽ có thể sử dụng chức năng chung của mình IsExists<T>()
.
Từ quan điểm hiệu suất, tôi đoán rằng một truy vấn SQL trực tiếp sử dụng lệnh EXISTS sẽ thích hợp. Xem tại đây để biết cách thực thi SQL trực tiếp trong Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
Tôi đã phải quản lý một tình huống trong đó tỷ lệ trùng lặp được cung cấp trong các bản ghi dữ liệu mới là rất cao và hàng nghìn lệnh gọi cơ sở dữ liệu đang được thực hiện để kiểm tra các bản sao (vì vậy CPU đã gửi rất nhiều thời gian ở mức 100%). Cuối cùng, tôi quyết định giữ 100.000 bản ghi cuối cùng được lưu trong bộ nhớ. Bằng cách này, tôi có thể kiểm tra các bản sao đối với các bản ghi được lưu trong bộ nhớ cache, cực kỳ nhanh khi so sánh với truy vấn LINQ dựa trên cơ sở dữ liệu SQL và sau đó ghi bất kỳ bản ghi mới thực sự nào vào cơ sở dữ liệu (cũng như thêm chúng vào bộ nhớ cache dữ liệu, mà tôi cũng sắp xếp và cắt để giữ cho độ dài của nó có thể quản lý được).
Lưu ý rằng dữ liệu thô là một tệp CSV chứa nhiều bản ghi riêng lẻ phải được phân tích cú pháp. Các bản ghi trong mỗi tệp liên tiếp (với tốc độ khoảng 1 cứ sau 5 phút) chồng chéo lên nhau đáng kể, do đó tỷ lệ trùng lặp cao.
Tóm lại, nếu bạn có dữ liệu thô được đánh dấu thời gian đến, khá nhiều thứ, thì việc sử dụng bộ nhớ đệm có thể giúp kiểm tra sự trùng lặp bản ghi.
Tôi biết đây là một chủ đề rất cũ nhưng chỉ trong trường hợp ai đó như bản thân tôi cần giải pháp này nhưng trong VB.NET đây là những gì tôi đã sử dụng dựa trên các câu trả lời ở trên.
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
Tôi đã gặp một số rắc rối với điều này - EntityKey của tôi bao gồm ba thuộc tính (PK với 3 cột) và tôi không muốn kiểm tra từng cột vì điều đó sẽ xấu. Tôi đã nghĩ về một giải pháp hoạt động mọi lúc với mọi thực thể.
Một lý do khác cho điều này là tôi không thích bắt UpdateExceptions mỗi lần.
Một chút Reflection là cần thiết để lấy giá trị của các thuộc tính chính.
Mã được triển khai dưới dạng tiện ích mở rộng để đơn giản hóa việc sử dụng như:
context.EntityExists<MyEntityType>(item);
Hãy xem:
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;
}
Tôi chỉ kiểm tra nếu đối tượng là null, nó hoạt động 100% cho tôi
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";
}
Tại sao không làm điều đó?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Bất kể đối tượng của bạn là gì và đối với bảng nào trong cơ sở dữ liệu, điều duy nhất bạn cần có là khóa chính trong đối tượng.
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