EF LINQ 写法

兔子家族-二哥 2017-10-16 11:37:16
IEnumerable<string> AreaList = GetAreaId(AreaId);
var ManagerList = LinqDBContext.ManagerOrg.Where(x => AreaList.Contains(x.AreaId)).Select(x => x.ManagerOrgID).ToList();
不能在查询运算符(Contains 运算符除外)的 LINQ to SQL 实现中使用本地序列。
求解为什么啊,怎么改
...全文
543 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰云 2018-01-18
  • 打赏
  • 举报
回复
引用 17 楼 God_Girl 的回复:
[quote=引用 9 楼 foren_whb 的回复:] 又是一个不会在自关联表里加path字段,导致一系列麻烦的的情况。。。。。
老铁 , 加什么path啊?[/quote] 我这里所说的path,是指的树形结构的path,自关联表,就可以看成是一棵树。有兴趣可以去翻下树和二叉树的资料
  • 打赏
  • 举报
回复
引用 9 楼 foren_whb 的回复:
又是一个不会在自关联表里加path字段,导致一系列麻烦的的情况。。。。。
老铁 , 加什么path啊?
  • 打赏
  • 举报
回复
引用 14 楼 hanjun0612 的回复:
[quote=引用 11 楼 God_Girl 的回复:] project socre state 语文 90 优 语文 95 优 数学 23 差
给你个例子:
static List<User> list = new List<User>()
        {
            new User(){id=1001	 ,name="语文",buyer="A"},
            new User(){id=1001	 ,name="语文",buyer="A"},
            new User(){id=1001	 ,name="数学",buyer="A"},
            new User(){id=1001	 ,name="数学",buyer="B"},
            new User(){id=1001	 ,name="数学",buyer="B"},
            new User(){id=1002	 ,name="英语",buyer="C"},
            new User(){id=1005	 ,name="英语",buyer="A"},
            new User(){id=1005	 ,name="英语",buyer="A"},
            new User(){id=1005	 ,name="英语",buyer="B"},
            new User(){id=1004	 ,name="计算机",buyer="A"},
            new User(){id=1007	 ,name="计算机",buyer="C"},
        };

        static void Main(string[] args)
        {
            var q = list.GroupBy(x => x.name).Select(x => new
            {
                name=x.Key,
                优秀=x.Count(y=>y.buyer=="A"),
                普通 = x.Count(y => y.buyer == "B"),
                差 = x.Count(y => y.buyer == "C"),
            });

            foreach (var item in q)
            {
                Console.WriteLine(item.name);
                Console.WriteLine("优秀:"+item.优秀);
                Console.WriteLine("普通:" + item.普通);
                Console.WriteLine("差:" + item.差);
            }

            Console.ReadLine();
        }

        public class User
        {
            public int id { get; set; }
            public virtual string name { get; set; }
            public virtual string buyer { get; set; }
            public virtual string idArr { get; set; }
        }
[/quote] SOS 版主,var a= LinqDBContext.onlineorg.Where(x => s.Contains(x.ManagerOrgID)); 然后 a 就不能 .tolist 也不能 count()了 。。。。 报错 就因为我调用了一个递归???
正怒月神 版主 2017-10-17
  • 打赏
  • 举报
回复
引用 15 楼 God_Girl 的回复:
SOS 版主,var a= LinqDBContext.onlineorg.Where(x => s.Contains(x.ManagerOrgID)); 然后 a 就不能 .tolist 也不能 count()了 。。。。 报错 就因为我调用了一个递归???
具体报错说什么?
丰云 2017-10-16
  • 打赏
  • 举报
回复
无论ef也好,sql也好,还是其他语言也好,都比较忌讳递归,尽量不要写递归方法
丰云 2017-10-16
  • 打赏
  • 举报
回复
又是一个不会在自关联表里加path字段,导致一系列麻烦的的情况。。。。。
正怒月神 版主 2017-10-16
  • 打赏
  • 举报
回复
引用 11 楼 God_Girl 的回复:
project socre state 语文 90 优 语文 95 优 数学 23 差
给你个例子:
static List<User> list = new List<User>()
        {
            new User(){id=1001	 ,name="语文",buyer="A"},
            new User(){id=1001	 ,name="语文",buyer="A"},
            new User(){id=1001	 ,name="数学",buyer="A"},
            new User(){id=1001	 ,name="数学",buyer="B"},
            new User(){id=1001	 ,name="数学",buyer="B"},
            new User(){id=1002	 ,name="英语",buyer="C"},
            new User(){id=1005	 ,name="英语",buyer="A"},
            new User(){id=1005	 ,name="英语",buyer="A"},
            new User(){id=1005	 ,name="英语",buyer="B"},
            new User(){id=1004	 ,name="计算机",buyer="A"},
            new User(){id=1007	 ,name="计算机",buyer="C"},
        };

        static void Main(string[] args)
        {
            var q = list.GroupBy(x => x.name).Select(x => new
            {
                name=x.Key,
                优秀=x.Count(y=>y.buyer=="A"),
                普通 = x.Count(y => y.buyer == "B"),
                差 = x.Count(y => y.buyer == "C"),
            });

            foreach (var item in q)
            {
                Console.WriteLine(item.name);
                Console.WriteLine("优秀:"+item.优秀);
                Console.WriteLine("普通:" + item.普通);
                Console.WriteLine("差:" + item.差);
            }

            Console.ReadLine();
        }

        public class User
        {
            public int id { get; set; }
            public virtual string name { get; set; }
            public virtual string buyer { get; set; }
            public virtual string idArr { get; set; }
        }
bidisty 2017-10-16
  • 打赏
  • 举报
回复

HisList.GroupBy(q => new { q.project, q.state}).Select(q => new  
    {  
        project= q.Key,  
        state= q.Count()
    });  
  • 打赏
  • 举报
回复
HisList.Where(x => x.cAlarmtype == "差").GroupBy(x => x.AreaId).Count(); 这样写了 我就不知道是哪一科的,反正很蒙啊
  • 打赏
  • 举报
回复
引用 5 楼 hanjun0612 的回复:
[quote=引用 4 楼 foren_whb 的回复:] 不用猜测了,他那个肯定是来自另外一个dbcontext
哦,也对,看他 GetAreaId(AreaId) 和 LinqDBContext 的确不像是一个dbcontext[/quote] 求解啊 我这边有一组数据 学科 不确定有几科,想根据学科来统计 根据state求数量,就是每科有几个差 有几个优 之类的 反正是要 goup by 了 求写法啊。groupe by 用的不熟 project socre state 语文 90 优 语文 95 优 数学 23 差
丰云 2017-10-16
  • 打赏
  • 举报
回复
引用 2 楼 hanjun0612 的回复:
不过我测试了类似你的代码,没发生同样的问题。 这是我的代码和截图 我分析下来,你的错误可能是以下情况 GetAreaId(AreaId);的具体类型是什么?可能出来的是个Iqueryable<string> 由于Iqueryable<T> 继承自 IEnumerable<T>,所以IEnumerable<string> AreaList = GetAreaId(AreaId);并没有报错。但其实资源没有加载到本地。 所以,你使用var AreaList = GetAreaId(AreaId).ToList();再试试看
不用猜测了,他那个肯定是来自另外一个dbcontext
丰云 2017-10-16
  • 打赏
  • 举报
回复
一楼正解! 要问为什么就复杂了,简单说就是跨上下文了,程序没法处理。。。。。 你只要知道不能这么做就行了,等以后对ef认识加深了,再来研究为什么
  • 打赏
  • 举报
回复
toList 去掉就可以了 泪崩啊
  • 打赏
  • 举报
回复
看代码 不说 啃爹的 问题 private IEnumerable<string> GetAreaId(string p_id) { var query = from c in this.LinqDBContext.Area where c.ParentId == p_id || c.AreaId==p_id select new { c.AreaId }; return query.Select(x=>x.AreaId).Concat(query.ToList().SelectMany(t => GetAreaId(t.AreaId))); } var AreaList = GetAreaId(AreaId).ToList(); 这里就报错咯
正怒月神 版主 2017-10-16
  • 打赏
  • 举报
回复
引用 4 楼 foren_whb 的回复:
不用猜测了,他那个肯定是来自另外一个dbcontext
哦,也对,看他 GetAreaId(AreaId) 和 LinqDBContext 的确不像是一个dbcontext
正怒月神 版主 2017-10-16
  • 打赏
  • 举报
回复
不过我测试了类似你的代码,没发生同样的问题。
这是我的代码和截图

我分析下来,你的错误可能是以下情况
GetAreaId(AreaId);的具体类型是什么?可能出来的是个Iqueryable<string>
由于Iqueryable<T> 继承自 IEnumerable<T>,所以IEnumerable<string> AreaList = GetAreaId(AreaId);并没有报错。但其实资源没有加载到本地。
所以,你使用var AreaList = GetAreaId(AreaId).ToList();再试试看
正怒月神 版主 2017-10-16
  • 打赏
  • 举报
回复
var AreaList = GetAreaId(AreaId).ToList(); var ManagerList = LinqDBContext.ManagerOrg.Where(x => AreaList.Contains(x.AreaId)).Select(x => x.ManagerOrgID).ToList();
DNetORM源码 源码描述: 一、源码介绍 1、DNetORM 是一款基于.net的轻量级的、轻配置的ORM框架,核心代码只有100K大小,支持SQLSERVER、MYSQL、ORACLE数据库,DNetORM的核心思想是,将最接近原生的C#代码映射出最符合场景的sql语句,从而最大程度提升开发效率。 2、为什么要开发一款orm框架,笔者在开发的这些年里,使用了很多框架,有第三方的譬如mybatis、nhibernate、ef等等,但是它们都不符合我的开发习惯,首先我喜欢轻配置,不喜欢将大量的sql语句写在配置文件里,也不喜欢将实体映射关系写在配置文件里,所以像mybatis、nhibernate这种重配置的orm我并不喜欢,EF算是一个功能强大的框架,但是EF也有一些缺陷,过于笨重,另外EF对于mysql、oracle的支持并不友好。另外还有一些其他框架接口封装的不友好、要么写法过于繁琐、要么接口不清晰,这些因素都是促使我写一个符合我的开发场景的orm 3、DNetORM使用起来非常简单,DNetORM拒绝封装过多的方法,这会造成使用的难度,只是封装了增删改查基本常用的一些方法,所以使用起来会非常简单。 4、DNetORM对于多表的联查进行了常规的封装支持了LEFT JOIN, INNER JOIN ,GROUP BY , ORDER BY, WHERE,对于复杂的写法,建议使用DNetORM提供的SQL查询接口,我们在开发中使用orm是为了提升开发效率,节省开发时间,这是为什么使用orm的目的,orm不是为了避免使用sql,实际开发中有很多查询语句会很复杂,如果依赖orm,首先orm即使支持的话也会写的很复杂,并不直观,以往有开发的筒子们在用linq实现相同的复杂一点的sql的时候,写个sql也就是5分钟,但是为了实现linq写法写了半小时,还写的不正确,所以这些都是违背开发精神的。所以ORM是一个开发工具,它的出现就是为了节省开发时间、提升开发效率,使用orm可以帮你解决增删改的繁杂琐事,在查询上,orm帮你处理了大部分的单表查询,在多表的查询上,orm帮你处理简单的多表查询,帮你最快的获取数据,至于复杂的sql查询,直接使用sql查询接口。也许这种做法更加合理。 二、注意事项 1、开发环境为Visual Studio 2015,使用.net 4.0开发。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧