【问题标题】:how to use joining with LinQ To Entity [closed]如何使用 LinQ To Entity 加入 [关闭]
【发布时间】:2019-03-11 08:52:21
【问题描述】:

我有这个代码

    var value = (from dc in _context.ContractDetails
                   where dc.EmployeeID == id
                    select dc.Amount);
    return value;
}

是否可以接受 Value.Sum();

【问题讨论】:

  • 请粘贴异常轨迹
  • LINQ 返回IEnumerable<decimal>(假设 ContractDetails.Amount 是小数)。但是您将其分配给decimal。您在寻找 Sum、First、Last、Min、Max 等吗?

标签: c# entity-framework linq-to-entities


【解决方案1】:

你想返回它的样子。与其让查询成为小数,不如让它成为它想要的(var,它真的是IEnumerable<decimal>)。然后你可以返回一个聚合。以总和为例

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 表中是否存在员工作为条件。

【讨论】:

  • 但是如果我们返回十进制,如何在 View 中实现它,我使用的是 MVC 5
  • @Mohammed 我认为原始问题已得到解答(两次使用 lambda,一次使用您的原始查询)。您的方法现在可以完全按照它的名称执行:public decimal GetSumOfAmount(int id) { }。将其安装到您的 MVC 中可能需要您针对遇到的特定问题创建一个不同的问题。祝你好运!
【解决方案2】:

您的 linq 语句生成 IQueryable<Amount>,您需要获取该结果并在其上调用 Sum() 以获得您正在寻找的结果。

首先,您是否可以使用导航属性(即Employee.ContracteDetails)而不是手动加入这两个集合?例如,

var sum = _context.Employee
    .Where( e => e.Id == id )
    .Select( e => e.ContractDetails.Sum( cd => cd.Amount ) )
    .SingleOrDefault();

其次,您没有使用来自Employee 的任何信息,即使您的where 子句单独引用ContractDetails;为什么从那里开始查询?请改用_context.ContractDetails

var sum = _context.ContractDetails
    .Where( cd => cd.EmployeeId == id )
    .Sum( cd => cd.Amount );

【讨论】:

  • 您错误地使用了SingleOrDefault。它需要一个谓词来过滤,而不是一个选择器来转换。
  • @juharr - 你是对的,冲过去了;应该是select,然后是SingleOrDefault;更正
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多