C# 如何使用LinQ连接到实体
我想返回每个员工的金额,他有多少合同,我有两个表 1-雇员 2-合同细节。 在上一个表中,我有(EmployeeID,(十进制)Amount)字段。 我尝试了下面的查询,但编译器说“无法将隐式类型iqerable转换为字符串” 这是我的密码C# 如何使用LinQ连接到实体,c#,asp.net-mvc,entity-framework,linq-to-entities,C#,Asp.net Mvc,Entity Framework,Linq To Entities,我想返回每个员工的金额,他有多少合同,我有两个表 1-雇员 2-合同细节。 在上一个表中,我有(EmployeeID,(十进制)Amount)字段。 我尝试了下面的查询,但编译器说“无法将隐式类型iqerable转换为字符串” 这是我的密码 public decimal GetSumOfAmount(int id) { decimal query = from emp in _context.Employees join cd in _context.Co
public decimal GetSumOfAmount(int id)
{
decimal query = from emp in _context.Employees
join cd in _context.ContractDetails
on emp.EmployeeID equals cd.EmployeeID
where cd.EmployeeID == id
select cd.Amount;
return query;
//decimal value = (from dc in _context.ContractDetails
// where dc.EmployeeID == id
// select dc.Amount).Sum();
//return value;
}
您想返回它看起来的总和。与其让查询是十进制的,不如让它成为它想要的(var,它实际上是
IEnumerable
)。然后你可以返回一个集合。例如Sum
var query = from emp in Employees
join cd in ContractDetails
on emp.EmployeeID equals cd.EmployeeID
where cd.EmployeeID == id
select cd.Amount;
return query.Sum();
如果这就是它的全部功能,那么我也觉得你根本不需要加入,而且这样做会更简单
var query = from cd in ContractDetails
where cd.EmployeeID == id
select cd.Amount;
return query.Sum();
。。。除非您使用联接作为条件来测试employee表中是否存在employee。您的linq语句会生成一个
IQueryable
,否则您需要获取该结果并对其调用Sum()
首先,您是否可以使用导航属性(即Employee.contractedtails
)来代替手动合并这两个集合?比如说,
var sum = _context.Employee
.Where( e => e.Id == id )
.Select( e => e.ContractDetails.Sum( cd => cd.Amount ) )
.SingleOrDefault();
其次,你没有使用任何你需要的来自员工
的信息,甚至你的where
条款只引用了合同细节
;为什么要在那里开始你的查询?使用\u上下文。改为使用ContractDetails
:
var sum = _context.ContractDetails
.Where( cd => cd.EmployeeId == id )
.Sum( cd => cd.Amount );
请粘贴异常轨迹LINQ返回一个IEnumerable
(假设ContractDetails.Amount为十进制)。但您正在将其分配给一个十进制
。您是否正在查找总和、第一个、最后一个、最小值、最大值等?您使用的SingleOrDefault
不正确。它需要一个谓词来过滤,而不是一个选择器来转换。@juharr-你是对的,匆匆通过它;应该是选择
然后单选或默认
;正确,但如果我们返回十进制,如何在视图中实现它,我使用的是MVC5@Mohammed我认为原始问题已经得到了回答(两次,一次是lambdas,一次是原始查询)。您的方法现在可以完全执行它所称的操作:public decimal GetSumOfAmount(int-id){}
。将其融入MVC可能需要您针对遇到的特定问题创建一个不同的问题。祝你好运