Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LinQ连接到实体_C#_Asp.net Mvc_Entity Framework_Linq To Entities - Fatal编程技术网

C# 如何使用LinQ连接到实体

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

我想返回每个员工的金额,他有多少合同,我有两个表 1-雇员 2-合同细节。 在上一个表中,我有(EmployeeID,(十进制)Amount)字段。 我尝试了下面的查询,但编译器说“无法将隐式类型iqerable转换为字符串” 这是我的密码

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可能需要您针对遇到的特定问题创建一个不同的问题。祝你好运