ONY*_*NYX 1 c# sql asp.net entity-framework
我的Entities集合中的存储过程中的第一列ForumGroup出现问题.我收到这个错误.
尝试从列序号'0'读取无效.使用CommandBehavior.SequentialAccess,您只能从列序号"3"或更高版本中读取.
我的Sql:
DECLARE @Forums TABLE(ForumGroup nvarchar(100), Title varchar(100), Description varchar(100), ThreadCount int, LastPostBy nvarchar(50),
LastPostDate datetime, LastPostTitle varchar(100))
INSERT INTO @Forums(ForumGroup, Title, Description, ThreadCount, LastPostBy, LastPostDate, LastPostTitle)
SELECT
(
CASE WHEN F.ParentID IS NOT NULL THEN
(SELECT Title FROM Forums S WHERE S.ForumID = F.ParentID)
ELSE
(SELECT Title FROM Forums S WHERE S.ParentID IS NULL)
END) AS ForumGroup,
Title, Description,
ThreadCount = (SELECT COUNT(*) FROM Posts P WHERE P.ForumID = F.ForumID),
LastPostBy = (SELECT TOP 1 AddedBy FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC),
LastPostDate = (SELECT TOP 1 AddedDate FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC),
LastPostTitle = (SELECT TOP 1 Title FROM Posts P WHERE P.ForumID = F.ForumID ORDER BY P.PostID DESC)
FROM Forums F WHERE ParentID IS NOT NULL
ORDER BY ForumGroup
SELECT * FROM @Forums
Run Code Online (Sandbox Code Playgroud)
我的C#:
public class Forums
{
public List<Forum> GetForums()
{
using (EntityConnection conn = new EntityConnection("name=CMSEntities"))
{
conn.Open();
EntityCommand cmd = conn.CreateCommand();
cmd.CommandText = "CMSEntities.sproc_Forums_GetForums";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
using (EntityDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
{
List<Forum> forums = new List<Forum>();
while (reader.Read())
{
Forum forum = new Forum(
1,
"",
DateTime.Now,
reader["Title"].ToString(),
reader["Description"].ToString(),
0,
false,
null,
null,
null,
true,
reader["ForumGroup"].ToString(),
(int)reader["ThreadCount"],
null,
DateTime.Now,
null);
forums.Add(forum);
}
return forums;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
来自CommandBehavior.SequentialAccess的文档:
“当您指定 SequentialAccess 时,您需要按照返回的顺序从列中读取数据,尽管您不需要读取每一列。一旦您读取了返回的数据流中的某个位置,则该位置或之前的数据无法再从 DataReader 读取位置。”
一旦你读完了Title和Description,你就不能读ForumGroup,你只能从第四列(索引 3)及以后读取。
所以,你基本上有三个选择:
select *无论如何都不要使用。)Forum。