在使用SilverLight进行开发时,结合WCF Ria进行数据库操作,大大提高了开发效率(至少对于本人数据库结构比较简单的情况来说)。当中免不了进行多表的联合查询,那么VS自动生成的代码就满足不了需求,于是定义了如下的类型
public class StockInfo
{
[Key]
[DisplayAttribute(Name = "类别", Order = 0)]
public String CategoryName { get; set; }
[DisplayAttribute(Name = "颜色", Order = 1)]
public String ColorName { get; set; }
[DisplayAttribute(Name = "里料", Order = 2)]
public String InsideMaterialName { get; set; }
[DisplayAttribute(Name = "面料", Order = 3)]
public String OutsideMaterialName { get; set; }
[DisplayAttribute(Name = "尺寸", Order = 4)]
public String SizeName { get; set; }
[DisplayAttribute(Name = "款式", Order = 5)]
public String StyleName { get; set; }
[DisplayAttribute(Name = "当前库存", Order = 6)]
public int StockCount { get; set; }
}
结果在Datagrid里面显示效果如下,有部分行重复显示,与实际情况不符。
这是什么原因造成的呢?第一感觉是在使用Linq进行查询的时候,使用了join,导致了查询结果重复(本人数据库、linq刚刚入门)。但是google了半天,发现网上也大体是这么做的。查询代码如下:
return from stock in context.Stock
join epc in context.Epc on stock.EpcId equals epc.EpcId
join category in context.Category on epc.CategoryId equals category.CategoryId
join color in context.Color on epc.ColorId equals color.ColorId
join insideMaterial in context.InsideMaterial on epc.InsideMaterialId equals insideMaterial.InsideMaterialId
join outsideMaterial in context.OutsideMaterial on epc.OutsideMaterialId equals outsideMaterial.OutsideMaterialId
join size in context.Size on epc.SizeId equals size.SizeId
join style in context.Style on epc.StyleId equals style.StyleId
select new StockInfo()
{
CategoryName = category.CategoryName,
ColorName = color.ColorName,
InsideMaterialName = insideMaterial.InsideMaterialName,
OutsideMaterialName = outsideMaterial.OutsideMaterialName,
SizeName = size.SizeName,
StyleName = style.StyleName,
StockCount = stock.StockCount
};
那会是什么情况呢?抱着试试的态度,在StockInfo类添加一个属性EpcId(这个值在数据库中是唯一的,在查询结果中也是唯一的),并设置KeyAttribute,同时配置为不显示。然后在查询代码中给EpcId赋值
[Key]
[DisplayAttribute(AutoGenerateField = false)]
public int EpcId { get; set; }
结果如何呢?如图
select new StockInfo() { EpcId = epc.EpcId, CategoryName = category.CategoryName, ColorName = color.ColorName, InsideMaterialName = insideMaterial.InsideMaterialName, OutsideMaterialName = outsideMaterial.OutsideMaterialName, SizeName = size.SizeName, StyleName = style.StyleName, StockCount = stock.StockCount };
问题是解决了,但是根本原因还不是很清楚,感觉微软使得编程原来越简单,或者说傻(好事,坏事?),不知道隐藏的代码干了什么事情。