C# LINQ查询没有返回一个应该存在的值

C# LINQ查询没有返回一个应该存在的值,c#,linq,epicorerp,C#,Linq,Epicorerp,在一段代码中,我有一个Foreach,用于遍历和计算数据库中可能存在或不存在的特定片段。基本上,对于订单上的每一个部分,我会继续计算它们所属的产品组,然后计算这些产品组所属的部门。为此,我使用以下LINQ查询: foreach (var OrderDtl_yRow in ( from ThisOrderDtl in Db.OrderDtl join ThisProdGrup in Db.Pro

在一段代码中,我有一个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... }
目前,我已经设置了消息框,以便在进程进行时将值返回给我。我得到了所有正确的返回,除了除法,它在消息框中总是显示为空(我假设为空)。所以我的除法计数器不会增加

如果我把它带到LINQPad中,我不确定如何返回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(),我得到了结果,果然,除法成功了。所以所有的迹象都表明它是好的,但我不能把它的价值带到我真正需要的地方。思想?谢谢

另外,对于熟悉Epicor的人来说,ERP部门是一个UD字段,因此在技术上它属于表ProdGrup_UD,但在Epicor中它认识到,作为表ProdGrup,它是唯一一个使您将_UD连接到父表的SQL。我试着加入它是为了好玩,但它不喜欢,因为它知道专栏已经在那里了。所以这应该没问题


更新:新手搬家,没有将部门数据上传到测试环境中,所以什么都没有,然后对照存在的实时数据进行检查,并搔搔我的头,问为什么不匹配。但是我学到了一些关于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\u UD

感谢您的这篇非常有用的帖子!我还没在林帕德打多少球。我记得你提到的dbo片段。我按照你的建议做了,它很好地提取了分区数据。我不确定我所能看到的效果和Epicor之间的脱节在哪里。。。嗯……或者我只是个白痴。我忘了我在Epicor中测试代码的开发系统中根本没有上传这些数据。很自然地,我使用Live来查看数据,并对数据不匹配的原因挠头。。。新手犯的错误。但谢谢你的回答,这至少让LinqPad对我更有用,所以有收获。