【问题标题】:LINQ Query Not Returning one value that should be thereLINQ 查询不返回一个应该存在的值
【发布时间】:2017-02-15 02:07:29
【问题描述】:

在一段代码中,我有一个 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() 我得到我的结果,果然,除法通过。所以所有迹象都表明它很好,但我无法在我真正需要它出现的地方带来价值。想法?谢谢!

附:对于熟悉 Epicor ERP Division 的人来说,是一个 UD 字段,所以它在技术上属于表 ProdGrup_UD,但在 Epicor 中,它认识到作为表 ProdGrup 就好了,它唯一的 SQL 使您将 _UD 连接到父表。无论如何,我尝试加入它以获得乐趣,但它不喜欢它,因为它知道该列已经存在。所以应该没问题。

更新:Rookie Move,没有将 Division 数据上传到测试环境中,所以那里什么也没有,然后检查了它存在的 Live 数据,并摸不着头脑,为什么它不匹配。但是我学到了一些关于 LinqPad 和 Linq 的知识,所以这不是一个无用的练习。

【问题讨论】:

    标签: c# linq epicorerp


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供的超级有用的帖子!我还没有在 LinqPad 中玩过很多。我记得你提到的 dbo 文章。我按照你的建议做了,它很好地提取了部门数据。我不确定我可以清楚地看到工作的结果和 Epicor 之间的脱节在哪里......嗯......
    • 或者我只是个白痴。我忘记了我根本没有在我们的开发系统中上传这些数据,而我在 Epicor 中测试代码。自然地,我使用 Live 只是拉取并查看数据并为为什么它不匹配而摸不着头脑......新秀错误。但是感谢您的回答,它至少使 LinqPad 对我更有用,所以有收获。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2018-07-13
    • 2010-11-28
    相关资源
    最近更新 更多