Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架多次查询会混合结果_C#_Asp.net_Entity Framework_Linq To Entities - Fatal编程技术网

C# 使用实体框架多次查询会混合结果

C# 使用实体框架多次查询会混合结果,c#,asp.net,entity-framework,linq-to-entities,C#,Asp.net,Entity Framework,Linq To Entities,我有一个实体的实例,我试图用同一个实例查询数据库2次或更多次 myAppDbEntities db = new myAppDbEntities(); List<user> usersList = db.users.Where(c => c.userid == usrID).ToList(); foreach (user u in usersList) { u.items = db.items.Where(c => c.userid == u.id &&a

我有一个实体的实例,我试图用同一个实例查询数据库2次或更多次

myAppDbEntities db = new myAppDbEntities();
List<user> usersList = db.users.Where(c => c.userid == usrID).ToList();

foreach (user u in usersList)
{
    u.items = db.items.Where(c => c.userid == u.id && c.date == today).ToList();
    item extraItem = db.items.Where(c => c.userid == u.id && c.date == yesterday).FirstOrDefault();
    //...
}

return usersList;
myAppDbEntities db=new myAppDbEntities();
List usersList=db.users.Where(c=>c.userid==usrID.ToList();
foreach(用户列表中的用户u)
{
u、 items=db.items.Where(c=>c.userid==u.id&&c.date==today).ToList();
item extraItem=db.items.Where(c=>c.userid==u.id&&c.date==beday).FirstOrDefault();
//...
}
返回用户列表;
问题是,当返回usersList时,extraItem将包含在用户的items列表中

我获取的所有数据似乎都是彼此关联的


谢谢

如果您在用户和项目之间定义了外键,usersList是指向myAppDbEntities.users的指针,因此无论您事先从数据库中获取什么,如果您找到一个用户并请求它的项目,则实体框架将转到数据库并获取它的所有项目,除非您当时给它一个过滤器

为了停止此行为并显式控制加载的实体,必须从上下文中删除该实体。下面是我使用EF 6.0测试此行为的代码示例:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var parents = GetParents();

        foreach (var parent in parents)
        {
            Console.WriteLine(@"Parent: " + parent.ParentId);

            foreach (var child in parent.Children)
            {
                Console.WriteLine(@"Child: " + child.ChildId);
            }
        }
    }

    private List<Parent> GetParents()
    {
        var context = new EFTestDBEntities();

        var parentList = context.Parents.Where(x => x.ParentId == 1).ToList();

        foreach (var parent in parentList)
        {
            // Commenting out the following line makes the above Console.WriteLines enumerate all children
            ((IObjectContextAdapter)context).ObjectContext.Detach(parent);
            parent.Children = context.Children.Where(x => x.ChildId == 1).ToList();
        }

        return parentList;
    }
private void按钮\u单击(对象发送者,路由目标)
{
var parents=GetParents();
foreach(父对象中的var父对象)
{
Console.WriteLine(@“Parent:+Parent.ParentId);
foreach(parent.Children中的变量child)
{
Console.WriteLine(@“Child:+Child.ChildId);
}
}
}
私有列表GetParents()
{
var context=新的EFTestDBEntities();
var parentList=context.Parents.Where(x=>x.ParentId==1.ToList();
foreach(parentList中的var parent)
{
//注释掉下面的行会使上面的Console.WriteLines枚举所有子级
((IObjectContextAdapter)context.ObjectContext.Detach(父级);
parent.Children=context.Children.Where(x=>x.ChildId==1.ToList();
}
返回父列表;
}

解决方案是对要独立的查询使用AsNoTracking():

myAppDbEntities db = new myAppDbEntities();
List<user> usersList = db.users.Where(c => c.userid == usrID).ToList();

foreach (user u in usersList)
{
    u.items = db.items.Where(c => c.userid == u.id && c.date == today).ToList();
    item extraItem = db.items.Where(c => c.userid == u.id && c.date == yesterday).**AsNoTracking()**.FirstOrDefault();
    //...
}

return usersList;
myAppDbEntities db=new myAppDbEntities();
List usersList=db.users.Where(c=>c.userid==usrID.ToList();
foreach(用户列表中的用户u)
{
u、 items=db.items.Where(c=>c.userid==u.id&&c.date==today).ToList();
item extraItem=db.items.Where(c=>c.userid==u.id&&c.date==beday)。**AsNoTracking()**.FirstOrDefault();
//...
}
返回用户列表;

如果您注释掉“item extraItem”行,它还会发生吗?不,如果我不使用“db”查询任何其他内容,结果就是我想要的结果。我还注意到,如果我重新初始化db=newmyappdbentities();它也起作用。我担心这样做是否正确?在每次新查询之前重新初始化db实例@EricScherrerI我被难住了,但从另一方面来说,这并不是奇怪的事情,这就是为什么我通常不从我的资源访问中返回EF对象,而是使用像AutoMapper这样的框架来返回DTO。我正在尝试重新创建它-在用户和项目之间的数据库中是否有外键?我怀疑u.items是指向加载到数据库中的任何实体的指针该用户id的items集合。因此,如果从db加载它,它将存在于u.items集合中。这就是我从EF时代回忆起的,现在正在验证。