我想建立一个sql查询库。
但是不幸的是,查询在子查询中不起作用。这是错误消息:
在先前的操作完成之前,第二操作在此上下文上开始。这通常是由使用同一DbContext实例的不同线程导致的,但是不能保证实例成员是线程安全的。这也可能是由于在客户端上评估了嵌套查询而引起的,如果是这种情况,请重写查询以避免嵌套调用。
这里是代码:
public class HomeController : Controller
{
private readonly TestContext _db;
public HomeController(TestContext db)
{
_db = db;
}
public List<Test2> GetTest2Data(int id)
{
return (from t2 in _db.Test2
where t2.Id == id
select t2).ToList();
}
public List<TestModel> GetTest1Data()
{
return (from t1 in _db.Test1
select new TestModel
{
Id = t1.Id,
Text = t1.Test,
ListTest2 = GetTest2Data(t1.Id)
}).ToList();
}
public IActionResult Index()
{
var test = GetTest1Data();
return View();
}
}
我该如何解决?
该代码有效,但不可恢复:
public class HomeController : Controller
{
private readonly TestContext _db;
public HomeController(TestContext db)
{
_db = db;
}
public List<TestModel> GetTest1Data()
{
return (from t1 in _db.Test1
select new TestModel
{
Id = t1.Id,
Text = t1.Test,
ListTest2 = (from t2 in _db.Test2
where t2.Id == t1.Id
select t2).ToList();
}).ToList();
}
public IActionResult Index()
{
var test = GetTest1Data();
return View();
}
}
型号:
public class Test1
{
public int Id { get; set; }
[StringLength(50)]
public string Test { get; set; }
public int? First { get; set; }
public int? Second { get; set; }
}
public class Test2
{
public int Id { get; set; }
[StringLength(50)]
public string Test2 { get; set; }
public int? First { get; set; }
public int? Second { get; set; }
}
public class TestModel
{
public int Id { get; set; }
public string Text { get; set; }
public List<Test2> ListTest2 { get; set; }
}
#Update 1
public List<TestModel> GetTest1Data()
{
return (from t1 in _db.Test1
select new TestModel
{
Id = t1.Id,
Text = t1.Test
}).ToList()
.Select(t1 => {
t1.ListTest2 = GetTest2Data(t1.Id);
return t1;
}).ToList();
}
答案 0 :(得分:0)
有很多建议可以提出,但是为了使问题简单易行,可以快速解决问题,您可以使用ToList()
根据上下文简单地更改检索数据的位置。
public List<TestModel> GetTest1Data()
{
return (from t1 in _db.Test1)
.ToList()
.Select(t => new TestModel
{
Id = t1.Id,
Text = t1.Test,
ListTest2 = GetTest2Data(t1.Id)
}).ToList();
}
这基本上将检索数据,完成第一个操作,然后分别调用Test2Data,因此您不会在上下文上执行并发操作。也就是说,请记住它将在每个Test1记录上调用Test2Data。毕竟只是一个测试:)
HTH