Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Asp.net 使用join从lambda表达式得到JsonResult_Asp.net_Asp.net Mvc_Linq_Lambda - Fatal编程技术网

Asp.net 使用join从lambda表达式得到JsonResult

Asp.net 使用join从lambda表达式得到JsonResult,asp.net,asp.net-mvc,linq,lambda,Asp.net,Asp.net Mvc,Linq,Lambda,我使用下面的Lambda表达式尝试连接两个模型(LyncUser)和(DDI),并仅返回两个模型中存在的DDI编号。在LyncUser中,该字段称为LyncUser.DDI,在DDI中,该字段称为DDI.Number 这将起作用并返回从LynchUsers控制器使用的所有DDI编号的列表 var lyncDB = new LyncUserEntities(); return Json(lyncDB.lyncUsers .Select(c => new { DDI = c.DDI }

我使用下面的Lambda表达式尝试连接两个模型(LyncUser)和(DDI),并仅返回两个模型中存在的DDI编号。在LyncUser中,该字段称为LyncUser.DDI,在DDI中,该字段称为DDI.Number

这将起作用并返回从LynchUsers控制器使用的所有DDI编号的列表

var lyncDB = new LyncUserEntities();
return Json(lyncDB.lyncUsers
    .Select(c => new { DDI = c.DDI }), JsonRequestBehavior.AllowGet);
当我将其更改为包含联接时,仅返回LynchUsers中存在但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);
}
仅LynchUsers中存在但DDI中不存在的DDI编号(…)

对我来说,这意味着您希望返回
LyncUsers
具有不作为
DDI.Number
存在的
DDI

你的代码,一个内部连接,做的恰恰相反。它返回两个值(
DDI
Number
)相等的实体。显然,在这个时刻,没有任何人符合这个条件

要实现您的目标,您应该使用不同的语句:

return Json(lyncDB.LyncUsers
    .Where(u => !lyncDB.DDIs.Any(ddi => ddi.Number == u.DDI)), JsonRequestBehavior.AllowGet);
当前应返回所有
lyncDB.LyncUsers

仅LynchUsers中存在但DDI中不存在的DDI编号(…)

对我来说,这意味着您希望返回
LyncUsers
具有不作为
DDI.Number
存在的
DDI

你的代码,一个内部连接,做的恰恰相反。它返回两个值(
DDI
Number
)相等的实体。显然,在这个时刻,没有任何人符合这个条件

要实现您的目标,您应该使用不同的语句:

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

这当前应返回所有
lyncDB.LyncUsers

我认为您根本不需要
Join
,因为您没有使用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在评论中的建议,将代码分成多行。这将允许在调试模式下检查结果,并更好地了解正在发生的事情。

我认为您根本不需要
Join
,因为您没有使用Join result

请尝试以下方法:

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在评论中的建议,将代码分成多行。这将允许在调试模式下检查结果,并更好地了解发生了什么。

如果您稍微拆分代码(不要立即返回它,将查询结果放入一个临时变量中,然后返回该变量),您是否可以逐步使用调试器并查看第二个查询是否实际返回结果?我怀疑您可能需要在返回之前首先调用
.ToList()
。如果您稍微拆分代码(不要立即返回它,将查询结果放入一个临时变量中,然后返回该变量),您是否可以逐步使用调试器并查看第二个查询是否实际返回结果?我想您可能需要在返回之前先调用
.ToList()
。谢谢。通过你的评论,我意识到我也走错了方向。我想返回DDI.Number中尚未在LyncUsers.DDI中使用的所有数字的列表。因此,我将您的建议颠倒如下…返回Json(lyncDB.DDIs.Where(u=>!lyncDB.LyncUsers.Any(ddi=>ddi.ddi==u.Number)),JsonRequestBehavior.AllowGet);谢谢通过你的评论,我意识到我也走错了方向。我想返回DDI.Number中尚未在LyncUsers.DDI中使用的所有数字的列表。因此,我将您的建议颠倒如下…返回Json(lyncDB.DDIs.Where(u=>!lyncDB.LyncUsers.Any(ddi=>ddi.ddi==u.Number)),JsonRequestBehavior.AllowGet);