2013-08-27 34 views
1

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

为什么?我究竟做错了什么?

信息关于我的项目:

.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; 
} 

模型浏览器和视觉工作室设置: 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] @[email protected],@ReleaseId=340,@TimeBoxId=NULL,@TeamId=NULL 
+0

您提供的所有信息都围绕着这个问题而跳舞。使用Sql Server Management Studio的Profiler截获EF发送给SQL Server的SQL并发布它。 –

+0

我从来没有用过它,但现在会尝试它,如果需要尽快回复你。谢谢 – Robodude

+0

当您直接对数据库执行SP时会返回多少结果;你的C#应用​​程序之外? – Servy

回答

1

从应用程序发送的查询通过的NULL的参数@TimeBoxId@TeamId明确的价值。

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

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

这解释了行为上的差异。

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

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