LINQ查询不返回应该存在的一个值

时间:2017-02-13 17:32:00

标签: c# linq epicorerp

在一段代码中,我有一个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... }

目前我已经设置了消息框,以便在流程进行时将值返回给我。除了分区之外,我得到了所有正确返回的内容,它总是在MessageBoxes中显示为空白(我假设为NULL)。所以我的分部计数器不会增加。

如果我把它拿到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(),我得到了我的结果,果然,分部来了。因此,所有迹象都表明它很好,但我无法将实际需要它的价值带到现场。思考?谢谢!

P.S。对于那些熟悉Epicor的人来说,Division是一个UD领域,所以它在技术上属于ProdGrup_UD表,但在Epicor中它认识到,作为表ProdGrup就好了,它唯一能让你将_UD连接到父表的SQL。我尝试加入它无论如何都是为了测试它并不喜欢它,因为它知道专栏已经存在了。所以这应该没问题。

更新:Rookie Move,没有将分部数据上传到测试环境中,所以没有任何内容,然后检查它存在的实时数据,并抓住我的头脑,为什么它不匹配。但是我学到了一些关于LinqPad和Linq的知识,所以这不是一个无用的练习。

1 个答案:

答案 0 :(得分:0)

您需要在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.ProdGrupErp.ProdGrup_UD