LINQ 查询不返回一个应该存在的值
LINQ Query Not Returning one value that should be there
在一段代码中,我有一个 Foreach,我用它来 运行 遍历并计算数据库中可能存在或不存在的特定片段。基本上对于订单的每个部分,我继续计算它们所属的产品组,然后计算这些产品组所属的部门。为此,我使用了这个 LINQ 查询:
foreach (var OrderDtl_yRow in ( from ThisOrderDtl in Db.OrderDtl
join ThisProdGrup in Db.ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.Company == Session.CompanyID &&
ThisOrderDtl.OrderNum == 195792
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}))
{ ....counting things... }
目前,我已经将消息框设置为 return 过程进行中给我的值。我把所有东西都正确地 return 除了部门,它总是在 MessageBoxes 中显示为空白(所以我假设是 NULL)。所以我的除法计数器不会增加。
如果我把它放到 LINQPad 中,我不确定如何 return foreach 的结果,但我用
试过了
if(OrderDtl_yRow.Division != null && OrderDtl_yRow.Division != "")
{i++;}
i.Dump();
得到了 5 个(我预计有 5 行,所以我至少在拉我们的东西)。然后我将它转换为更简单的 FirstOrDefault 语句来测试单个值,如
var OrderDtl_yRow = ( from ThisOrderDtl in OrderDtl
join ThisProdGrup in ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.OrderNum == 195792 &&
ThisOrderDtl.OrderLine == 1
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}).FirstOrDefault();
然后,如果我执行 OrderDtl_yRow.Dump(),我会得到我的结果,果然,分区通过了。所以所有迹象都表明它很好,但我无法带来我实际需要它出现的价值。想法?谢谢!
P.S。对于那些熟悉 Epicor ERP Division 的人来说是一个 UD 领域,所以它在技术上属于 table ProdGrup_UD,但在 Epicor 中它承认作为 table ProdGrup 就好了,它只是 SQL 让你加入 _UD 到父 table。无论如何,我尝试加入它是为了好玩,但它不喜欢它,因为它知道该专栏已经存在。这样应该没问题。
更新:Rookie Move,没有将 Division 数据上传到测试环境中,所以那里什么也没有,然后检查存在的实时数据,并摸不着头脑想知道为什么它不匹配。但我学到了一些关于 LinqPad 和 Linq 的东西,所以这不是一个无用的练习。
您需要在 Linqpad 中多玩一些以查看发生了什么,将语言设置为 C# 程序,按 F4 并添加对 Server\Bin\Epicor.System.dll 和 Server\Assemblies\Erp 的引用。 Data.910100.dll 并将 app.copnfig 指向您的 Server\web.config 文件。在主块中,使用 var Db = new Erp.ErpContext();
创建自己的 Db 上下文
Linqpad 可以显示复杂的数据结构,因此您不必在上一个示例中完成 FirstOrDefault。例如:
void Main()
{
var Db = new Erp.ErpContext();
var sessionCompany = "EPIC06";
var x = (from hed in Db.OrderHed
join dtl in Db.OrderDtl
on new { hed.Company, hed.OrderNum }
equals new { dtl.Company, dtl.OrderNum }
into dtlList
where
hed.Company == sessionCompany
select new { hed, dtlList })
.Dump();
}
另请注意,在 SQL 中,dbo.ProdGrup
是一个自动生成的视图,它为您连接表 Erp.ProdGrup
和 Erp.ProdGrup_UD
。
在一段代码中,我有一个 Foreach,我用它来 运行 遍历并计算数据库中可能存在或不存在的特定片段。基本上对于订单的每个部分,我继续计算它们所属的产品组,然后计算这些产品组所属的部门。为此,我使用了这个 LINQ 查询:
foreach (var OrderDtl_yRow in ( from ThisOrderDtl in Db.OrderDtl
join ThisProdGrup in Db.ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.Company == Session.CompanyID &&
ThisOrderDtl.OrderNum == 195792
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}))
{ ....counting things... }
目前,我已经将消息框设置为 return 过程进行中给我的值。我把所有东西都正确地 return 除了部门,它总是在 MessageBoxes 中显示为空白(所以我假设是 NULL)。所以我的除法计数器不会增加。
如果我把它放到 LINQPad 中,我不确定如何 return foreach 的结果,但我用
试过了if(OrderDtl_yRow.Division != null && OrderDtl_yRow.Division != "")
{i++;}
i.Dump();
得到了 5 个(我预计有 5 行,所以我至少在拉我们的东西)。然后我将它转换为更简单的 FirstOrDefault 语句来测试单个值,如
var OrderDtl_yRow = ( from ThisOrderDtl in OrderDtl
join ThisProdGrup in ProdGrup on
ThisOrderDtl.ProdCode equals ThisProdGrup.ProdCode
where
ThisOrderDtl.OrderNum == 195792 &&
ThisOrderDtl.OrderLine == 1
select new
{
ProdCode = ThisOrderDtl.ProdCode,
Division = ThisProdGrup.Division_c,
OrderNum = ThisOrderDtl.OrderNum,
OrderLine = ThisOrderDtl.OrderLine
}).FirstOrDefault();
然后,如果我执行 OrderDtl_yRow.Dump(),我会得到我的结果,果然,分区通过了。所以所有迹象都表明它很好,但我无法带来我实际需要它出现的价值。想法?谢谢!
P.S。对于那些熟悉 Epicor ERP Division 的人来说是一个 UD 领域,所以它在技术上属于 table ProdGrup_UD,但在 Epicor 中它承认作为 table ProdGrup 就好了,它只是 SQL 让你加入 _UD 到父 table。无论如何,我尝试加入它是为了好玩,但它不喜欢它,因为它知道该专栏已经存在。这样应该没问题。
更新:Rookie Move,没有将 Division 数据上传到测试环境中,所以那里什么也没有,然后检查存在的实时数据,并摸不着头脑想知道为什么它不匹配。但我学到了一些关于 LinqPad 和 Linq 的东西,所以这不是一个无用的练习。
您需要在 Linqpad 中多玩一些以查看发生了什么,将语言设置为 C# 程序,按 F4 并添加对 Server\Bin\Epicor.System.dll 和 Server\Assemblies\Erp 的引用。 Data.910100.dll 并将 app.copnfig 指向您的 Server\web.config 文件。在主块中,使用 var Db = new Erp.ErpContext();
Linqpad 可以显示复杂的数据结构,因此您不必在上一个示例中完成 FirstOrDefault。例如:
void Main()
{
var Db = new Erp.ErpContext();
var sessionCompany = "EPIC06";
var x = (from hed in Db.OrderHed
join dtl in Db.OrderDtl
on new { hed.Company, hed.OrderNum }
equals new { dtl.Company, dtl.OrderNum }
into dtlList
where
hed.Company == sessionCompany
select new { hed, dtlList })
.Dump();
}
另请注意,在 SQL 中,dbo.ProdGrup
是一个自动生成的视图,它为您连接表 Erp.ProdGrup
和 Erp.ProdGrup_UD
。