存储过程枚举不会产生任何结果

时间:2013-08-27 14:35:02

标签: c# entity-framework stored-procedures

我正在尝试在项目中执行存储过程,但枚举不会产生任何结果。

为什么呢?我做错了什么?

关于我的项目的信息:

.NET Framework 4.5
<package id="EntityFramework" version="5.0.0" targetFramework="net45" />
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64)

手动使用存储过程并返回正确的数据:

DECLARE @return_value int

EXEC    @return_value = [dbo].[GetFeatures]
        @XMLDoc = N'<ArrayOfInt><int>280</int><int>286</int><int>279</int><int>292</int><int>277</int></ArrayOfInt>',
        @ReleaseId = 340

SELECT  'Return Value' = @return_value

这是我在代码中执行存储过程的地方:

public ObjectResult<GetFeatures_Result> GetFeatures(List<int> featureIds, int releaseId, int? timeboxId, int? teamId)
{
    string xmlFeatureIds = null;   

    var xs = new XmlSerializer(typeof(List<int>)); 
    var ms = new MemoryStream(); 
    xs.Serialize(ms, featureIds.ToList()); 

    //xmlFeatureIds = Encoding.UTF8.GetString(ms.ToArray());
    xmlFeatureIds = "<ArrayOfInt><int>280</int><int>286</int><int>279</int><int>292</int><int>277</int></ArrayOfInt>";
    //releaseId = 340;
    var release = _rmContext.Releases.FirstOrDefault(x => x.Id == releaseId);//works, Releases is just a table
    var obj = _rmContext.GetFeatures(xmlFeatureIds, releaseId, null, null); //enumeration didn't yield any results
    var obj2 = _rmContext.GetFeatures(xmlFeatureIds, releaseId, null, null).ToList(); //length of this is zero.

    return obj;
}

模型浏览器和visual studio设置: enter image description here

编辑:

从SQL分析器:

declare @p1 xml
set @p1=convert(xml,N'<ArrayOfInt><int>280</int><int>286</int><int>279</int><int>292</int><int>277</int></ArrayOfInt>')
exec [dbo].[GetFeatures] @XMLDoc=@p1,@ReleaseId=340,@TimeBoxId=NULL,@TeamId=NULL

1 个答案:

答案 0 :(得分:1)

您的应用程序发送的查询会为参数NULL@TimeBoxId传递显式值@TeamId

您在SSMS中测试的那个完全省略了这些参数。

如果参数具有默认值,则仅在省略参数或指定DEFAULT关键字时应用这些参数。

这解释了行为上的差异。

我不确定是否有任何方法可以让EF生成的查询执行此操作,但您可以更改应用程序以传递所需的默认值0而不是NULL或更改存储过程所以第一步是。

SET @TimeBoxId = ISNULL(@TimeBoxId,0)
SET @TeamId = ISNULL(@TeamId,0)