首页 > 其他 > 详细

LINQ中in的实现方法-LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4)

时间:2014-11-14 23:57:38      阅读:673      评论:0      收藏:0      [点我收藏+]

如果用in是字符串类型无问题,可以直接这样用

  var result = SNFService.Instance.ModuleService.GetList(UserInfo).Where(entity => entity.DeletionStateCode == 0
                ).Where(entity => urls.Contains((entity.NavigateUrl == null ? "" : entity.NavigateUrl).ToLower())).OrderBy(entity => entity.SortCode).ToList();

如果是数值类型需要按如下处理:

熟悉LINQ的朋友也许会碰到标题的问题,且很自然地想起使用下面地语句实现:  

 

IList<int> ids = new List<int> { 2, 3, 4 };
var list = context.TestTables.Where(a => ids.Contains(a.RID)).ToList();

 

然而,运行发现系统会抛出如下异常:  

LINQ to Entities 不识别方法“Boolean Contains(Int32)”,因此该方法无法转换为存储表达式。

 究其原因,是Contains是IList类型的扩展方法而linq无法转换过来。所以上述办法就无法得到我们想要的结果(虽然编译不会有错)。

 

 

 但可喜的是可以使用string类型的扩展方法Contains;当然这里需要在原表增加计算字段

 

 

[IDSearched] AS ((‘,‘+CONVERT([varchar](10),[RID],0))+‘,‘)

 

 

而获取数据的Linq查询语句就可以这样实现:

string ids = ",2,3,4,5,";
var list = context.TestTables.Where(a => ids.Contains(a.IDSearched)).ToList();

 

 

上面语句运行时,LINQ To Entities会将其翻译为如下SQL语句:

bubuko.com,布布扣
SELECT
[Extent1].[RID] AS [RID],
[Extent1].[NAME] AS [NAME],
[Extent1].[ROWDATE] AS [ROWDATE],
[Extent1].[DBSID] AS [DBSID],
[Extent1].[BIRTHDATE] AS [BIRTHDATE],
[Extent1].[NOTE] AS [NOTE]
FROM [dbo].[TestTable] AS [Extent1]
WHERE (CAST(CHARINDEX([Extent1].[NOTE], ‘hhh,ggg‘) AS int)) > 0
bubuko.com,布布扣

LINQ中in的实现方法-LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4)

原文:http://www.cnblogs.com/spring_wang/p/4098332.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!