当前位置:编程学习 > C#/ASP.NET >>

linq to Entities的主外间关联条件过滤 问题

代码如下,
List<Module> modules = new List<Module>();
            modules = (from ms in DBEntities.Module
                       join act in DBEntities.Action on ms.ModuleID equals act.ModuleID
                      where ms.ModuleID == act.ModuleID && act.IsVisiable.Value
                      select ms).ToList();

我想从Module表中查找出所有的模块,以及其外键关联的功能(Action),但是并不是所有的关联到的Action都需要返回,而是要对这个子表中的IsVisiable属性进行过滤;这样的linq怎么写。我现在写的这个运行时报错:
The specified LINQ expression contains references to queries that are associated with different contexts.

如果简单的直接返回Module会把所有子表的Action记录也查出来,数据比较大,我想直接在通过Entity查的时候就过滤掉,而不是查出来之后再做处理。

--------------------编程问答--------------------

List<Module> modules = new List<Module>();
  modules = (from ms in DBEntities.Module
             join act in DBEntities.Action
             on ms.ModuleID equals act.ModuleID
             where  act.IsVisiable.Value
             select ms).ToList(); 
--------------------编程问答-------------------- 如果不行
你可以帖出你的SQL语句 来看一下 --------------------编程问答-------------------- 不行,直接抛异常,还是那个错,SQL语句也无法得到 --------------------编程问答-------------------- 呵呵,对LINQ to Entities暂时还没有学习,不太了解。
不过看异常信息,貌似你使用了两个不同的数据上下文吧?
另外,你那个查询语句中,竟然使用了join语句,就不需要在where语句中才进行ms.ModuleID == act.ModuleID判断了,具体做法可参见1楼。 --------------------编程问答-------------------- 1楼写的没问题,我想不是语句的问题 --------------------编程问答-------------------- 语句有了,
List<Module> modules = new List<Module>();
  modules = (from ms in DBEntities.Module
             where ms.Action.Any(a=>a.IsVisiable.Value)
             select ms).ToList(); 
或者
modules =DBEntities.Module.Where(ms=>ms.Action.Any(a=>a.IsVisiable.Value)).ToList();

现在不报错,可以查询出结果,但是对于外键关联表Action却没有过滤掉记录,而是照样全部返回?
需要的结果是IsVisiable为true的Action,怎么会这样呢.. --------------------编程问答-------------------- List<Module> modules = new List<Module>();
  modules = (from ms in DBEntities.Module
  where ms.Action.Any(a=>a.IsVisiable==true)
  select ms).ToList();   --------------------编程问答-------------------- List<Module> modules = new List<Module>();
  modules = (from ms in DBEntities.Module
             from act in DBEntities.Action
              where ms.ModuleID == act.ModuleID &&
              act.IsVisiable.Value
              select ms).Distinct().ToList();

 看看这样行不行。应该是可以的。
补充:.NET技术 ,  LINQ
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,