EF实现多表关联动态条件查询

刚用EF完成了一个十多个表联合、动态条件的查询,因为不熟悉表达式树的使用,就想了笨办法,下面做个总结:
1.EF无法根据条件动态join表,一开始就需要确定使用那些表,准备好数据集;所以把条件分了几个大类,只要条件都属于一个类别的,优先使用这个类别相关部分表的联合查询,能提高效率。如果条件涉及多个类别,就用一个left join所有表的数据集来查询;
2.因为是left join,当数据集中有些字段不是可空字段的时候,查询时会出现类型转换错误,这种情况下,需要在select新字段集时,不可空(null)字段做个处理:NewFieldName=p.FieldName == null ? AA : p.FieldName,这里的AA代表当字段值为空时用来替换的默认值;
3.在给EF的where条件中赋值的时候,如果是在一个foreach的循环中,用var item这个对象来给条件赋值,其结果是,所有条件全部是从最后一个item对象中取值,导致除了最后一个条件赋值正确外,其他全部是错误的。这是应为EF是在最后查询时才生成SQL语句并获取参数并执行的,它的机制中貌似只记录了参数的变量地址,而不是值。解决方法就是,在每次使用item时,定义一个新变量来保存这个对象,即使是在局部范围内定义亦可;部分示例代码:
		var qry = from p in Ent.PaInfoes
                      where p.MOBILE != ""
                      select new
                      {
                          p.CNO,
                          p.PNAME,
                          p.GENDER,
                          p.BIRTHDAY,
                          p.MARRIAGE,
                          p.RACE,
                          p.BLOOD,
                          p.PURSUIT,
                          p.MOBILE,
                          p.MAKEDATE,
                          p.MAKEHOSNAME,
                          p.RESPDOCNAME,
                          p.MAKENURNAME,
                          p.JIGUAN,
                          p.COMMUNI
                      };
 
            foreach (var item in pnlConditionList.Controls)
            {
                switch (((UCSearch)item).SearchCondition)
                {
                    //姓名
                    case SearchCondition.scName:
                        UCSearch usName = (UCSearch)item;
                        if (usName.TextValue != "")
                            qry = qry.Where(d => d.PNAME == usName.TextValue);
                        break;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C is a programming language that was originally developed in the 1970s by Dennis Ritchie at Bell Labs. It is a general-purpose, imperative programming language that is widely used for developing operating systems, system software, embedded systems, and other applications that require low-level access to hardware. C is a compiled language, meaning that code written in C is first translated into machine code by a compiler before being executed. This makes it a relatively fast language compared to interpreted languages like Python or JavaScript. C is known for its low-level features, including pointers and direct memory manipulation, which give developers fine-grained control over the behavior of their programs. This also means that C programs can be more prone to errors, such as buffer overflows or memory leaks, if not written carefully. C has influenced many other programming languages, including C++, Java, and Python. It remains a popular language for system programming, embedded systems, and other applications that require low-level control over hardware. ### 回答2: C 是计算机编程语言中的一种,它是一种通用的高级编程语言。C 语言由美国计算机科学家德尼斯·里奇在20世纪70年代开发出来,最初是为了编写操作系统UNIX而设计的。C 语言相对简单,但功能强大,可以用于开发各种软件和应用。 C 语言具有丰富的数据类型,如整数、浮点数、字符以及数组、结构等。它还有强大的控制结构,如条件语句、循环语句和跳转语句,使得程序的编写更加灵活。C 语言还支持函数的定义和调用,这样可以将程序分为多个模块,提高代码的可维护性。 C 语言的代码编写简洁,运行效率高,非常适合系统底层的开发。许多操作系统、编译器、数据库和嵌入式系统等都是用C语言编写的。C 语言也是很多编程新手的入门语言,因为它的学习曲线相对较低,但掌握 C 语言的基础知识对于学习其他编程语言非常有帮助。 C 语言是一种面向过程的语言,较为底层,需要程序员手动管理内存。为了降低内存管理的负担,后来又出现了C++语言,它是在 C 语言的基础上增加了面向对象的特性,使得编程更加高级和简化。但是,C 语言仍然被广泛使用,特别是在嵌入式系统、驱动程序和核心开发等领域。 总之,C 语言是一种重要的编程语言,具有简洁高效、灵活多样的特点,广泛应用于计算机科学和软件开发领域。掌握 C 语言可以为进一步学习其他编程语言打下良好的基础。 ### 回答3: C是计算机科学领域重要的编程语言之一,它由美国贝尔实验室的Dennis Ritchie开发。C语言于1972年首次发布,之后逐渐流行并成为了广泛应用的编程语言。C语言的设计目标是提供一种直接的、可移植的编程语言,用来开发高效的系统软件和应用程序。 C语言具有很多特点。首先,C语言是一种结构化的编程语言,它通过使用函数和块来组织代码,使程序的结构更加清晰和可读。其次,C语言具有丰富的运算符和表达式,可以进行复杂的数学运算和逻辑判断。另外,C语言具备高度的可移植性,可以在不同的硬件平台上编译和运行。 C语言还具有丰富的标准库函数,可以方便地实现诸如文件操作、字符串处理、内存管理等功能。此外,C语言还支持指针操作,允许直接访问和操作内存地址,提高程序的效率。 在计算机科学领域,C语言被广泛应用于系统软件的编写,如操作系统、编译器等。同时,C语言也是许多高级编程语言的基础,如C++、Java等,因此熟练掌握C语言将有助于学习和理解其他编程语言。 总而言之,C语言作为计算机科学领域的一种重要编程语言,具有结构化、高效、可移植的特点,被广泛应用于系统软件和应用程序的开发。对于学习和理解计算机科学的基本原理和概念来说,掌握C语言是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值