EF下LINQ to Entities不支持语法及替代方案

简介: LINQ to Entities是Ado.net Entity Framework的查询语言之一,它为了更好的兼容更多种的数据库所以在使用方法上有所精简,比之linq2SQL却少了一些好用的方法,下面就说一下这些日子来使用它时遇到的问题及解决方法 以下只列出了完全Not supported的内容,部分supported的方法都可以通过简单的增简参数解决 1.

LINQ to Entities是Ado.net Entity Framework的查询语言之一,它为了更好的兼容更多种的数据库所以在使用方法上有所精简,比之linq2SQL却少了一些好用的方法,下面就说一下这些日子来使用它时遇到的问题及解决方法

以下只列出了完全Not supported的内容,部分supported的方法都可以通过简单的增简参数解决

1.Contains

这一函数在linq2sql中将生成in方法

var s=db.Account.Select(c => c.ID);
var ret =(from t in db.Profile
where s.Contains(t.ID)
select t).ToList();

  将生成类似

select * from profile p where p.id in (1, 2, 3, 4)

的SQL语句,但是这在LINQ to Entities中是行 不通的,

可以使用

 var ids=db.Account.Select(c => c.ID);
var ret = (from t in db.Profile
where ids.Any(c=>c==t.UserID)
select t).ToList();

来完成。

2.DefaultIFEmpty

这个在VS里进行了自动提示,可以使用First或FirstOrDefault来解决。

3.Reverse

原来的

    var x = (from c in context.Customers         
select c).Reverse();

要用orderby descending来重写

    var x = from c in context.Customers
orderby c.Address.Region descending
select c;

来代替

4.ElementAt

原来的用法

ElementAt(index)

可以用Take,Skip或索引的方式选取,它的使用方法是灵活多样的

至于ElementAtOrDefault,可以通过以上方法选取后,使用FirstOrDefault来获得,当然,这样取还有不少问题,希望大家在实践中可以解决

5.Last/LastOrDefault

可以通过orderby descending之后取First/FirstOrDefault来完成

6.Single/SingleOrDefault

可以用First/FirstOrDefault来替换

7.SkipWhile/TakeWhile

Accounts.SkipWhile((x, index) => x.UserID >=1000)

这个就较为复杂要用繁杂一些的语句来实现

from a1 in Accounts
where a1.UserID>=(from a in Accounts where a.UserID>1000 select a).FirstOrDefault().UserID
select a1

 

当然,这只是其中一种实现方法,TakeWhile与SkipWhile 几本相同。

Linq to Entities语法支持表:http://msdn.microsoft.com/en-us/library/bb738550.aspx

 
目录
相关文章
解决java.lang.IllegalStateException: Failed to load ApplicationContext错误~
解决java.lang.IllegalStateException: Failed to load ApplicationContext错误~
1294 0
|
监控 网络协议 数据库连接
Python3 监控端口:使用 socket 库
Python3 监控端口:使用 socket 库
224 1
|
存储 人工智能 C++
C++ 实现对战AI五子棋
C++ 实现对战AI五子棋
|
存储
NameNode 故障无法重新启动解决方法
当NameNode进程挂掉时,若无数据丢失,可直接使用`hdfs --daemon start namenode`重启。但若数据丢失,需从SecondaryNameNode恢复。首先查看启动日志,确认因数据丢失导致的未启动成功问题。接着,将SecondaryNameNode的备份数据拷贝至NameNode的数据存储目录,目录路径在`core-site.xml`中设定。进入NameNode节点,使用`scp`命令从SecondaryNameNode复制数据后,重启NameNode进程,故障即可修复。
1748 0
|
SQL 监控 关系型数据库
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
MySQL Binlog深度解析:进阶应用与实战技巧【进阶应用】
941 0
|
关系型数据库 MySQL 数据库
MySQL如何安装配置(含my.ini详细配置-新旧版通杀)
MySQL如何安装配置(含my.ini详细配置-新旧版通杀)
10497 0
|
前端开发 小程序 关系型数据库
推荐基于.Net6+Furion +iView开发的一套极简的进销存管理系统
一个基于.Net Core构建的简单、跨平台、模块化的小程序考试系统。前端采用Vue+iView框架,后端采用Furion架构,让开发变得更简单。
521 0
推荐基于.Net6+Furion +iView开发的一套极简的进销存管理系统
|
Oracle Java 关系型数据库
JDK、JVM和JRE三者间的关系,及JDK安装路径下的文件夹说明
JDK的全称是Java SE Development Kit, 即Java标准开发包,是Sun公司提供的一套用于开发Java应用程序的开发包, 它提供了编译、运行Java查询所需的各种工具和资源,包括ava编译器、Java运行时环境以及常用的 Java类库等。
399 0
JDK、JVM和JRE三者间的关系,及JDK安装路径下的文件夹说明
|
安全 搜索推荐 数据建模
【直播发布】Quick BI V4.0重磅推出即席分析&模板市场,新版数据集交互体验全面提升
【直播发布】Quick BI V4.0重磅推出即席分析&模板市场,新版数据集交互体验全面提升
588 0
【直播发布】Quick BI V4.0重磅推出即席分析&模板市场,新版数据集交互体验全面提升
|
存储 SQL 弹性计算
阿里云数据库RDS通用型和独享型区别在哪?如何选择?
阿里云数据库RDS通用型和独享型区别在哪?如何选择?阿里云数据库RDS按照规格分为通用型和独享型两种不同类型。老魏在本文中详细解释这两种不同数据库类型的区别及如何选择。