Linq错误在先前的操作完成之前,第二种操作已在此上下文上开始

时间:2019-08-09 16:07:47

标签: linq asp.net-core-mvc entity-framework-core


我想建立一个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();
}

1 个答案:

答案 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