【问题标题】:LINQ in WCF returning repeating resultsWCF 中的 LINQ 返回重复结果
【发布时间】:2017-07-19 20:16:46
【问题描述】:

我在 WCF 服务中有一个 LINQ 查询,它运行并返回我正在寻找的正确数量的结果,但重复第一个结果 25 次,而不是向我显示所有 25 条不同的记录。

奇怪的是,当我将它从调试器生成的 SQL 查询插入 SQL 管理工作室时,我得到了正确的结果。

我尝试刷新从 edmx 查询的视图,并尝试用几种不同的方式重写查询,但我开始没有想法了。 我在下面包含了一些代码。任何的意见都将会有帮助。谢谢!

try
        {
            using (Entities db = new Entities())
            {
                var qInventory = db.vw_Web_Store_Inventory_Live
                                    .Where(qi => qi.Sku_Number == inputSKU)
                                    .ToList();

                resultPInventory.SKU = inputSKU;
                resultPInventory.StoreInventory = new List<StoreItem>();

                foreach (var qi in qInventory)
                {
                    resultPInventory.StoreInventory.Add(new StoreItem
                    {
                        StoreNum = qi.Store_Number,
                        Quantity = qi.Curr_Inv
                    });
                }
            }
        }
        catch (Exception e)
        {
            log.Error("[" + e.TargetSite + "] | " + e.Message);
        }

        log.Info("ProductInventory(" + inputSKU + ") returned " + resultPInventory.StoreInventory.Count + " results");

        return resultPInventory;

【问题讨论】:

标签: c# sql linq wcf


【解决方案1】:

正如 Gert 在 cmets 中的链接所指出的,如果您的主键设置不正确,或者如果您的数据库中有多行没有唯一值,则有时 LINQ 可能会这样做。

This link 也出现了类似的问题。

除了使用更好的主键/唯一键重写数据库列(尽管从长远来看这会更好)之外,解决方案是匿名选择特定值(稍后您可以轻松地分配它们):

var qInventory = db.vw_Web_Store_Inventory_Live
                    .Where(qi => qi.Sku_Number == inputSKU)
                    .Select(qi => new { qi.Store_Number, qi.Curr_Inv })
                    .ToList();

resultPInventory.SKU = inputSKU;
resultPInventory.StoreInventory = new List<StoreItem>();

foreach (var qi in qInventory)
{
    resultPInventory.StoreInventory.Add(new StoreItem
    {
        StoreNum = qi.Store_Number,
        Quantity = qi.Curr_Inv
    });
}

当然,如果您以后需要将qInventory 用于其他事情,这不是最好的方法。 (在这种情况下,您可以选择更多字段)

PS,这是一种缩短代码的方法,但我不确定 LINQ to Entities 是否允许,所以先测试一下:

resultPInventory.SKU = inputSKU;
resultPInventory.StoreInventory = db.vw_Web_Store_Inventory_Live
                                  .Where(qi => qi.Sku_Number == inputSKU)
                                  .Select(qi => new StoreItem { StoreNum = qi.Store_Number, Quantity = qi.Curr_Inv })
                                  .ToList();

【讨论】:

  • 这完全合理并解决了问题。感谢您的洞察力和帮助!
【解决方案2】:

在添加之前将 new StoreItem() 分配给变量。

【讨论】:

  • 鉴于 a)列表已经初始化(new List&lt;StoreItem&gt;(); 和 b)OP 正在添加新实例(resultPInventory.StoreInventory.Add(new StoreItem(...),我看不到如何创建新实例和 然后添加它会解决问题.....
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 2017-11-07
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多