【问题标题】:JsonResult from lambda expression using join使用连接的 lambda 表达式的 JsonResult
【发布时间】:2015-08-23 20:14:19
【问题描述】:

我正在使用以下 Lambda 表达式尝试加入两个模型 (LyncUser) 和 (DDI),并且只返回两个模型中都存在的 DDI 编号。在 LyncUser 中,该字段称为 LyncUser.DDI,在 DDI 中称为 DDI.Number。

这有效并返回从 LyncUsers 控制器使用的所有 DDI 号码的列表。

var lyncDB = new LyncUserEntities();
return Json(lyncDB.lyncUsers
    .Select(c => new { DDI = c.DDI }), JsonRequestBehavior.AllowGet);

当我将其更改为合并连接时,仅返回存在于 LyncUsers 中但不存在于 DDI 中的 DDI 号码,它无法恢复任何内容。

public JsonResult GetAvailableDDINumbers()
{
    var lyncDB = new LyncUserEntities();
    return Json(lyncDB.LyncUsers
        .Join(lyncDB.DDIs, avail => avail.DDI, used => used.Number,
             (used, avail) => new { used = used, avail = avail })
        .Where(joined => joined.used.DDI == joined.avail.Number), JsonRequestBehavior.AllowGet);
}

【问题讨论】:

  • 如果你把代码拆开一点(不要马上返回,把查询的结果放到一个临时变量中然后返回),你能不能用调试器单步调试看看第二个查询实际上返回结果?我怀疑您可能需要在返回之前先致电.ToList()

标签: asp.net asp.net-mvc linq lambda


【解决方案1】:

仅存在于 LyncUsers 中但不存在于 DDI 中的 DDI 号码 (...)

对我来说,这意味着您想要返回 LyncUsers,而 DDI 并不作为 DDI.Number 存在。

你的代码,一个内连接,正好相反。它返回两个值(DDINumber)相等的实体。显然,目前,没有任何人符合这个条件。

要实现你想要的,你应该使用不同的语句:

return Json(lyncDB.LyncUsers
    .Where(u => !lyncDB.DDIs.Any(ddi => ddi.Number == u.DDI)), JsonRequestBehavior.AllowGet);

这目前应该返回所有lyncDB.LyncUsers

【讨论】:

  • 谢谢。我意识到你的cmets我也有错误的方式。我想返回 DDI.Number 中尚未在 LyncUsers.DDI 中使用的所有号码的列表。所以我将您的建议颠倒如下...return Json(lyncDB.DDIs .Where(u => !lyncDB.LyncUsers.Any(ddi => ddi.DDI == u.Number)), JsonRequestBehavior.AllowGet);跨度>
【解决方案2】:

我认为您根本不需要Join,因为您没有使用连接结果。

试试这个:

var lyncDB = new LyncUserEntities();
var result = lyncDB.lyncUsers
    .Where(x => !lyncDB.DDIs.Any(y => y.Number == x.DDI))
    .Select(x => new { DDI = x.DDI });
return Json(result, JsonRequestBehavior.AllowGet);

此外,按照@Nate Barbettini 在评论中的建议,将您的代码分成多行。这将允许在调试模式下检查结果并更好地了解正在发生的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多