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

如果用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语句:

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

时间: 2024-12-04 10:35:42

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

linq中let关键字学习

linq中let关键字就是对子查询的一个别名,let子句用于在查询中添加一个新的局部变量,使其在后面的查询中可见. linq中let关键字实例 1.传统下的子查询与LET关键字的区别 C# 代码   复制 static void Main(string[] args) { int[] numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; //传统下的子查询做法 var query = from num in numbers select num * (fr

Linq中GroupBy方法的使用总结(转)

Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class StudentScore { public int ID { set; get; } public string Name { set; get; } public string Course { set; get; } public int Score { set; get; } public str

使用Linq中的Distinct方法对序列进行去重操作

使用Linq提供的扩展方法Distinct可以去除序列中的重复元素. 该方法具有以下两种重载形式: (1)public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source) (重载1) 通过使用默认的相等比较器对值进行比较并返回序列中的非重复元素. (2)publicstatic IQueryable<TSource> Distinct<TSour

LINQ:开始使用 LINQ(五)- LINQ 中的查询语法和方法语法

开始使用 LINQ(五)- LINQ 中的查询语法和方法语法 在表示语言集成查询 (LINQ) 使用 LINQ 性查询语法,文档中的多数查询编写.但是,编译代码时,必须将查询语法转换为方法,这就需要 .NET 公共语言运行时 (CLR).这些方法调用标准查询运算符的名称类似 Where.Select.GroupBy.Join.Max和 Average.可以调用这些方法直接使用方法语法而不是查询语法. 查询语法和方法语法语义相同,但是,许多人员发现查询语法更简单.更易于阅读.某些查询必须表示为方法

LINQ中的扩展方法

LINQ中的where(),OderByDescending().Select()并不是IEnumerable<T>的方法,却能使用这些方法,查阅了资料发现是用到了C#的扩展方法. 举个小例子: 定义一个静态类StringExtension和静态方法Foo,关键字this. public static class StringExtension { public static void Foo(this string s) { Console.WriteLine("Foo invok

LINQ中ForEach方法的使用

标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报 分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载. LINQ中ForEach方法的使用. 1.实例一:使用ForEach获取列表中的某个字段值 [csharp] view plain copy 在CODE上查看代码片派生到我的代码片 /// <summary> /// 使用ForEach获取列表中员工名称字段 /// </summary> stat

Linq中string转int的方法

Linq中string转int的方法 在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." 原因是Linq不支持ToString()函数. 可用下述方法进行转换解决: string source = "1,2,3,4

[转]Linq中GroupBy方法的使用总结

Linq中GroupBy方法的使用总结 Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class StudentScore { public int ID { set; get; } public string Name { set; get; } public string Course { set; get; } public int Score { se

关于Linq中First、FirstOrDefault;Single、SingleOrDefault等方法的说明

关于Linq中First.FirstOrDefault:Single.SingleOrDefault等方法的说明 这里以First.FirstOrDefault进行说明,其他类似. 1.First:取序列中满足条件的第一个元素,如果没有元素满足条件,则抛出异常 2.FirstOrDefault:取序列中满足条件的第一个元素,如果没有元素满足条件,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0) 3.Single,返回序列中的唯一一条记录,