如何将扁平的关系数据行放入C#类?
我有一个使用Entity Framework的应用程序,但据我所知,如果联接不在主键上,最新的Entity Framework仍然无法联接表 因此,我有一个C#代码,它调用一个连接一些表并返回数据的存储过程。这是我问题的简化版本 我有一个返回问题数据的关系数据库。如果有一个问题有五个答案,那么将返回五行,每行将具有相同的问题信息 以下是数据要进入的类:如何将扁平的关系数据行放入C#类?,c#,sql-server,entity-framework,entity-framework-6,C#,Sql Server,Entity Framework,Entity Framework 6,我有一个使用Entity Framework的应用程序,但据我所知,如果联接不在主键上,最新的Entity Framework仍然无法联接表 因此,我有一个C#代码,它调用一个连接一些表并返回数据的存储过程。这是我问题的简化版本 我有一个返回问题数据的关系数据库。如果有一个问题有五个答案,那么将返回五行,每行将具有相同的问题信息 以下是数据要进入的类: public partial class Result1 { public Guid QuestionUId { get; set; }
public partial class Result1
{
public Guid QuestionUId { get; set; }
public string Text { get; set; }
public int AnswerId { get; set; }
public string AnswerText { get; set; }
}
我需要的是获取这些关系数据并创建问题类的集合:
public partial class Question
{
public Guid QuestionUId { get; set; }
public string Text { get; set; }
public string Answer { get; set; }
public ICollection<Answer> Answers { get; set; }
}
public partial class Answer
{
public int AnswerId { get; set; }
public string AnswerText { get; set; }
}
公共部分类问题
{
公共Guid问题UID{get;set;}
公共字符串文本{get;set;}
公共字符串答案{get;set;}
公共ICollection答案{get;set;}
}
公共部分类答案
{
public int AnswerId{get;set;}
公共字符串应答文本{get;set;}
}
有人能给我一些想法吗?我如何获得数据并将其放入问题类中,以便正确填充答案字段
以下是我目前掌握的情况:
var sql = @"dbo.sp_get_questions @UserId,
@UserTestId;";
SqlParameter[] parameters = new SqlParameter[]
{
new SqlParameter("@UserId", Int32.Parse(User.Identity.GetUserId())),
new SqlParameter("@UserTestId", userTestId)
};
try
{
var query = db.Database.SqlQuery<Result1>(sql, parameters);
var questions1 = await query.ToListAsync();
var questions2 = questions1
.Select((t, index) => new
var sql=@“dbo.sp_get_questions@UserId,
@UserTestId;“;
SqlParameter[]参数=新的SqlParameter[]
{
新的SqlParameter(“@UserId”,Int32.Parse(User.Identity.GetUserId()),
新的SqlParameter(“@UserTestId”,UserTestId)
};
尝试
{
var query=db.Database.SqlQuery(sql,参数);
var questions1=wait query.ToListAsync();
变量问题2=问题1
.选择((t,索引)=>新建
问题是我根本不知道如何做。选择,甚至我是否采取了正确的方法
希望有人能帮助我。如果您对EF加入的方式不满意,您仍然可以创建自己的。我不确定您的数据是如何构造的,但您可以编写如下内容:
context.Questions
.GroupJoin
(
context.Answers,
x=>x.Id, // this is the pk on Questions
x=>x.QuestionId //this is the fk on Answers
(q,a)=>new Question
{
q.QuestionUId,
q.Text,
Answers = a.Select(an=>new Answer{an.AnswerId,an.AnswerText})
}
)
这将产生一组问题,其中每个问题都有一组答案。如果您对EF的连接方式不满意,您仍然可以创建自己的。我不确定您的数据是如何构造的,但您可以编写如下内容:
context.Questions
.GroupJoin
(
context.Answers,
x=>x.Id, // this is the pk on Questions
x=>x.QuestionId //this is the fk on Answers
(q,a)=>new Question
{
q.QuestionUId,
q.Text,
Answers = a.Select(an=>new Answer{an.AnswerId,an.AnswerText})
}
)
这将产生一组问题,其中每个问题都有一组答案。如果您对EF的连接方式不满意,您仍然可以创建自己的。我不确定您的数据是如何构造的,但您可以编写如下内容:
context.Questions
.GroupJoin
(
context.Answers,
x=>x.Id, // this is the pk on Questions
x=>x.QuestionId //this is the fk on Answers
(q,a)=>new Question
{
q.QuestionUId,
q.Text,
Answers = a.Select(an=>new Answer{an.AnswerId,an.AnswerText})
}
)
这将产生一组问题,其中每个问题都有一组答案。如果您对EF的连接方式不满意,您仍然可以创建自己的。我不确定您的数据是如何构造的,但您可以编写如下内容:
context.Questions
.GroupJoin
(
context.Answers,
x=>x.Id, // this is the pk on Questions
x=>x.QuestionId //this is the fk on Answers
(q,a)=>new Question
{
q.QuestionUId,
q.Text,
Answers = a.Select(an=>new Answer{an.AnswerId,an.AnswerText})
}
)
这将导致出现一组问题,其中每个问题都有一组答案。EF并不需要外键进行连接。如果没有外键,它不会创建导航属性。但你应该问问自己,为什么要进行一个一开始不涉及外键的连接。EF不需要外键外键进行连接。如果没有外键,它就不会创建导航属性。但是你应该问问自己,为什么要进行一个不包含外键的连接。EF并不需要外键来进行连接。如果没有外键,它就不会创建导航属性。但是你可以你应该问问自己,为什么你要做一个一开始就不涉及外键的连接。并不是EF需要外键来进行连接。如果没有外键,它不会创建导航属性。但是你应该问问自己,为什么你要做一个一开始就不涉及外键的连接。谢谢你的帮助nswer。但是,这不会导致从数据库返回大量行吗?您可以始终在查询中添加Where子句以限制返回的行。感谢您的回答。但是,这不会导致从数据库返回大量行吗?您可以始终按顺序在查询中添加Where子句限制返回的行。感谢您的回答。但是,这不会导致从数据库返回大量行吗?您可以始终在查询中添加Where子句以限制返回的行。感谢您的回答。但是,这不会导致从数据库返回大量行吗?您可以始终在查询中添加Where子句以限制返回的行。