我从SQL Server中的视图中进行简单查询:
SELECT [PricePerM]
FROM RealtyStatParent
ORDER BY PricePerM
当我在SQL Management Studio中执行查询时,我得到了正确的结果.这意味着我从1.00开始获得2532行,结束于173543.6893.
当我使用实体框架从C#进行查询时,我得到了相同的结果:
var justDecimals = context.RealtyStatParents
.OrderBy(item => item.PricePerM)
.Select(item => item.PricePerM)
.ToArray();
到现在为止没什么特别但我真正不理解的是跟随查询.我首先选择整行,然后选择价格(十进制).
var entireRows = context.RealtyStatParents
.OrderBy(item => item.PricePerM)
.ToArray();
var decimalFromRows = entireRows
.Select(item => item.PricePerM)
.ToArray();
PricePerM的许多值重复(值1或48)而不是实际值,并且结果集未正确排序.
EF设计器中行的定义很简单:
public partial class RealtyStatParent
{
public Nullable<decimal> PricePerM { get; set; }
public int BusinessCategory { get; set; }
public decimal obec_kod { get; set; }
public Nullable<int> ParentCategoryId { get; set; }
}
UPDATE
我相信这种奇怪的行为与Entity Framework returning bad data有关,因为视图没有主键. EF决定实体密钥在Column BusinessCategory和obec_kod上,它是唯一的组合.我希望我更接近,但仍然不够.
最佳答案 这种奇怪行为的原因已经提到
here或
here.似乎EF内部缓存整个表,但EF选择了错误的唯一键,结果行中的数据被来自不同行的数据替换.
此SELECT由视图构成.此视图没有主键. EF决定过于聪明,并选择自己的主键用于缓存目的.但EF选择了错误的密钥,我的意思是EF只选择了2列中的4列.
要修复它,请转到EDMX模型,右键单击有问题的视图标题,然后选择“在模型浏览器中显示”.然后检查所有列是否将EntityKey属性设置为true.就这些.
由于EF的这个和其他“功能”,我对EF有点失望.这个代码在LinqToSQL中运行良好,没有任何魔法.当LinqToSql行为正常且EF行为至少有问题或崩溃运行时,它不是第一个查询.我担心微软会在这里打破“得到你期望的模式”.当我查询整个视图时,我只期望从视图中获取数据的简单代码.