我有一个方法可以从存储过程中返回最小的结果来填充选择菜单。当我想要最简单的结果时,我将 bool getMin = true 传递给存储过程,当我想要完整记录时,我传递 bool getMin = false。
这导致“数据读取器与指定的不兼容”的实体框架错误
错误中最相关的部分
{"Message":"发生错误。","ExceptionMessage":"数据读取器与指定的 'CatalogModel.proc_GetFramingSystems_Result' 不兼容。类型的成员 'FrameType' 在同名数据读取器。","ExceptionType":"System.Data.EntityCommandExecutionException",
显然,错误告诉我,当数据读取器尝试设置不在查询结果中的属性“FrameType”时。
现在我明白了这个错误,我想知道的是我是否要把这个 sql sproc 分成两个 sprocs,或者有没有办法解决这个问题?
我的功能如下
public static IEnumerable<IFramingSystem> GetFramingSystems(int brandID, string frameType, string glazeMethod, bool getMin)
{
using (CatalogEntities db = new CatalogEntities())
{
return db.proc_GetFramingSystems(brandID, frameType, glazeMethod, getMin).ToList<IFramingSystem>();
};
}
下面是我的 TSQL
ALTER proc [Catelog].[proc_GetFramingSystems]
@BrandID INT,
@FrameType VARCHAR(26),
@GlazeMethod VARCHAR(7) ='Inside',
@getMin BIT = 0
as
BEGIN
SET NOCOUNT ON;
IF @getMin =0
BEGIN
SELECT c.ID,c.Name,c.Descr,c.FrameType,c.isSubFrame,
c.GlassThickness,c.GlassPosition,c.GlazingMethod,c.SillProfile
from Catelog.Component c
WHERE c.MyType ='Frame'
AND c.FrameType = @FrameType
AND c.GlazingMethod = @GlazeMethod
AND c.ID IN(
SELECT cp.ComponentID FROM Catelog.Part p JOIN
Catelog.ComponentPart cp ON p.ID = cp.PartID
WHERE p.BrandID = @BrandID
)
ORDER BY c.Name
END
ELSE
SELECT c.ID,c.Name,c.Descr
from Catelog.Component c
WHERE c.MyType ='Frame'
AND c.FrameType = @FrameType
AND c.GlazingMethod = @GlazeMethod
AND c.ID IN(
SELECT cp.ComponentID FROM Catelog.Part p JOIN
Catelog.ComponentPart cp ON p.ID = cp.PartID
WHERE p.BrandID = @BrandID
)
ORDER BY c.Name
SET NOCOUNT OFF;
END;