为什么我的Where工作不像我认为的那样?

时间:2014-12-15 11:14:05

标签: linq entity-framework

我正在尝试从结果可能超过一行的数据库中获取一些数据。

我有以下代码:

public System.Linq.IQueryable<Users> getUser2(string idUser)
{
    try
    {
        using (Entities c = new Entities())
        {
            c.ContextOptions.LazyLoadingEnabled = false;
            c.ContextOptions.ProxyCreationEnabled = false;

            return c.Users.Include("Empresas").Where(x => x.Login == idUser && x.Empresas.Activa == true);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

但它似乎没有得到任何结果,它显示的东西就像一个形状错误的Iqueryable,我的意思是如果我展开它的结果视图我可以看到一条消息说“ObjectContext实例已被删除,不能用于操作需要连接“如果我尝试使用函数ElementAt(索引)访问任何Users元素,我会得到一个IndexOutOfBounds错误,因为如果在调试模式下观察它看起来没有数据。

我推断出它是故障,因为这段代码在返回它找到满足条件的第一个用户时工作正常:

public Users getUser(string idUser)
{
    try
    {
        using (Entities c = new Entities())
        {
            c.ContextOptions.LazyLoadingEnabled = false;
            c.ContextOptions.ProxyCreationEnabled = false;

            return c.Users.Include("Empresas").FirstOrDefault(x => x.Login == idUser && x.Empresas.Activa == true);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

那里的工作方式与我认为应该的方式不同吗?如果那时,我怎样才能得到几个满足条件的数据?我在getUser中传递相同的条件但是有几行?

感谢您的关注。

1 个答案:

答案 0 :(得分:0)

你需要枚举结果,所以在&#34;其中&#34;声明补充。 ToList()将枚举并执行对您的数据库的查询。 FirstOrDefault正在执行查询,这就是您获得结果的原因。

您需要检查延迟方法并了解它们的工作原理。

修改 以下是一些链接,向您展示延迟方法与LINQ中的Immediate方法之间的差异

1- http://www.dotnetcurry.com/showarticle.aspx?ID=750

2- http://www.codeproject.com/Articles/627081/LINQ-Deferred-Execution-Lazy-Evaluation

3- http://visualcsharptutorials.com/linq/deferred-execution

希望有所帮助。