LINQ-to-SQL IN / Contains()用于Nullable
|
我想在LINQ中生成这个SQL语句: select * from Foo where Value in ( 1,2,3 ) 棘手的一点似乎是Value是一个允许空值的列. 等效的LINQ代码似乎是: IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
var myFoos = from foo in foos
where values.Contains(foo.Value)
select foo;
当然,这不会编译,因为foo.Value是一个int?和值的类型为int. 我试过这个: IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
IEnumerable<int?> nullables = values.Select( value => new Nullable<int>(value));
var myFoos = from foo in foos
where nullables.Contains(foo.Value)
select foo;
…还有这个: IEnumerable<Foo> foos = MyDataContext.Foos;
IEnumerable<int> values = GetMyValues();
var myFoos = from foo in foos
where values.Contains(foo.Value.Value)
select foo;
这两个版本都给了我期望的结果,但它们不会生成我想要的SQL.它们似乎正在生成全表结果,然后在内存中进行Contains()过滤(即:在普通LINQ中,没有-to-SQL); DataContext日志中没有IN子句. 有没有办法为Nullable类型生成SQL IN? 注意 事实证明,我遇到的问题没有任何关系包含或Nullable,所以我的问题的措辞在很大程度上是无关紧要的.有关详细信息,请参阅@Nick Craver的接受答案. 解决方法这适用于您的示例:IEnumerable<int> values = GetMyValues();
var myFoos = from foo in MyDataContext.Foos;
where values.Contains(foo.Value.Value)
select foo;
作为IEnumerable转换< T>从一开始就意味着执行将在SQL之外,而是调用IQueryable< Foo>直.如果您转换为IEnumerable并在查询中使用它,它将获取所有MyDataContext.Foos然后使用该迭代器并在C#中而不是在SQL中执行查询的其余部分. 如果要在SQL中运行,请不要在此过程中的任何位置转换为IEnumerable.效果与在查询中使用MyDataContext.Foos.AsEnumerable()相同. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何将SELECT sql查询结果保存在C#Asp.net中的数组中
- mysql数据库备份设置延时备份方法(mysql主从配置)
- sonarqube – 什么是声纳数据库结构?
- sql-server – 与从Management Studio中的文本执行的相同查
- sql – Rails包含()LEFT OUTER JOIN和自定义ON子句
- SQL Server 合并DataTable并排除重复数据的通用用法
- linux mysql忘记密码的多种解决或Access denied for user r
- 对缺少索引的SQL Server索引创建的想法
- SQL重置已填充表中的标识ID
- sql-server – 在SQL Server CE中插入行并检索新行的标识
