Har*_*ier 15 c# linq linq-to-entities entity-framework
我只是有一个非常简单的情况,我需要的是使用Linq2Entities删除记录.我试图做一些研究,仍然无法找到正确的方法来做到这一点.
这是我的简单代码:
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
where y.EmployeeId == z.EmployeeId
select y).FirstOrDefault();
ctx.DeleteObject(x);
ctx.SaveChanges();
}
}
[DataObjectMethod(DataObjectMethodType.Select)]
public List<Employee> GetAllEmployee()
{
using (var ctx = new MyEntity())
{
var x = from y in ctx.Employees
select y;
return x.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以删除一个特定的记录,例如我将y.EmployeeName =="Harold Javier"分配给上面的Delete方法,但是当我将y.EmployeeId == z.EmployeeId分配给上面的代码时,删除不起作用.(注意:EmployeeId是Employee表的主键)
小智 14
我认为这是删除的更好选择
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
orderby y.EmployeeId descending
select y).FirstOrDefault();
ctx.Employees.Remove(x);
ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
在我这边DeleteObject不工作所以我用Remove
你首先需要在实际删除之前验证是否存在记录;
[DataObjectMethod(DataObjectMethodType.Delete)]
public void DeleteEmployee(Employee z)
{
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
where y.EmployeeId == z.EmployeeId
select y).FirstOrDefault();
if(x!=null)
{
ctx.Employees.DeleteObject(x);
ctx.SaveChanges();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在删除某些内容之前,请务必检查空值.因为用户可能会更改Id(在查询字符串处)并尝试不同的组合.
@Harold,我知道这篇文章已经很老了,但我觉得解决您最初的问题和答案很重要。您的解决方案可能适用于您的情况,但存在一些问题。
首先,您的原始代码是根据传入的参数选择要删除的记录。您的解决方案是删除具有最大 EmployeeId 的记录。这可能是你想要的,但不太可能。第二个问题是需要两次数据库访问才能完成删除。第一个是获取要删除的实体,第二个是实际执行删除。
以下代码片段将消除读取的需要,并将删除员工“z”。这应该会产生所需的结果并且性能更好。
public void DeleteEmployeeId(Employee z)
{
using (var ctx = new MyEntityContext())
{
var x = new Employee{ EmployeeId = z.EmployeeId };
ctx.Entry(x).State = EntityState.Deleted;
ctx.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
上面的答案可能已过时...在当前版本的ENtity Framework中似乎不存在DeleteObject方法。我不得不使用Remove方法。
var delobj = db.mytable.Where(p => p.ServiceLocation == serviceLocationID).SingleOrDefault();
db.myTable.Remove(delobj);
Run Code Online (Sandbox Code Playgroud)
我决定回答我自己的问题。
当我执行以下操作时,我的删除功能起作用了:
using (var ctx = new MyEntity())
{
var x = (from y in ctx.Employees
orderby y.EmployeeId descending
select y).FirstOrDefault();
ctx.Employees.DeleteObject(x);
ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我知道可能有比这更好的方法,但它同时对我有用。