我在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;
答案 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()分配给变量。