WCF中的LINQ返回重复结果

时间:2017-07-19 20:16:46

标签: c# sql linq wcf

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

奇怪的是,当我从调试器生成它生成的SQL查询并将其插入SQL Management Studio时,我得到了正确的结果。

我尝试刷新了我从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;

2 个答案:

答案 0 :(得分:0)

正如Gert在评论中指出的那样,如果主键设置不好,或者数据库中有多行没有唯一值,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();

答案 1 :(得分:-1)

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