删除带孩子的记录

时间:2017-06-20 10:46:15

标签: c# entity-framework linq

       //Delete Last Record which has income
        var itemToRemove = db.People.LastOrDefault(p => p.Incomes.Any());
        db.Incomes.RemoveRange(itemToRemove.Incomes);
        db.People.Remove(itemToRemove);

它给了我这个错误

  

未处理的类型' System.NotSupportedException'发生在EntityFramework.SqlServer.dll

中      

其他信息:LINQ to Entities无法识别方法' EF_Examples_02.Person LastOrDefault [Person]

我有两个表(人,收入),每个人可以有n个收入。 两个表有关系。

2 个答案:

答案 0 :(得分:1)

此处的问题是LastOrDefault未转换为SQL语句。

基本上你有两个选择:

首先获取所有数据:

//the tolist will fetch the data from the database
db.People.ToList().LastOrDefault(p => p.Incomes.Any()); 

或者按降序排序,也许按id:

db.People.Where(p => p.Incomes.Any()).OrderByDescending(c => c.Id).FirstOrDefault();

至于混合选项:

db.People.Where(p => p.Incomes.Any()).ToList().LastOrDefault();

答案 1 :(得分:1)

问题出在LastOrDefault中。 Ling-to-Entities不支持它。

您必须知道几个Enumerable函数不能作为Queryable执行。

MSDN Supported and Unsupported LINQ Methods (LINQ to Entities)

  

LastOrDefault:不支持

幸运的是,支持FirstOrDefault。

如果您在没有任何排序的情况下搜索First / Last,通常结果是相当不可预测的。

考虑为自己指定什么叫做Last元素,之后很容易按降序排序,所以它将是你的第一个元素,可以查询。