当前位置: 首页 > 编程语言 > C#

如果不支持Contains,如何在LINQtoEntities(实体框架)中执行SQL风格的“IN”语句?分享

时间:2023-04-11 10:58:46 C#

如果不支持Contains,如何在LINQtoEntities(实体框架)中执行SQL风格的“IN”语句?我正在使用LINQtoEntities(不是LINQtoSQL),但在创建“IN”样式查询时遇到了问题。这是我当前的查询:varitems=db.InventoryItem.Include("Kind").Include("PropertyValues").Include("PropertyValues.KindProperty").Where(itm=>valueIds.Contains(itm.ID)).ToList();但是,当我这样做时,会引发以下异常:LINQtoEntities无法识别“BooleanContains(Int64)”方法,并且无法将此方法转换为存储表达式。有没有人有解决方法或其他解决方案?你需要使用这个:.Where(string.Format("it.IDin{0}",string.Join(",",valueIds.ToArray())));或按照本文所述动态构建WHERE部分。PS-信息已更新,下面更新了此答案以保持其相关性:引用的链接包含以下更新:...在EF4中,我们添加了对Contains方法的支持,至少在这种特定情况下,是对集合值参数的支持。所以这种代码现在可以直接使用,不需要使用任何额外的表达式来构建方法:varstatusesToFind=newList{1,2,3,4};varfoos=fromfooinmyEntities.FooswherestatusesToFind.Contains(foo.Status)selectfoo;在某些情况下,您可以使用Linq的Any扩展方法:varuserIds=new[]{1,2,3};来自UserswhereuserIds.Any(i=>i==u.Id)selectu;这种情况下生成的SQL看起来很奇怪,但就像Linq-to-Entities生成的SQL一样,对人类来说可能过于冗长,但在实践中运行速度很快。SELECT[Extent1].[Id]AS[Id],[Extent1].[DisplayName]AS[DisplayName],FROM[dbo].[Users]AS[Extent1]WHEREEXISTS(SELECT1AS[C1]FROM(SELECT[UnionAll1].[C1]AS[C1]FROM(SELECT1AS[C1]FROM(SELECT1ASX)AS[SingleRowTable1]UNIONALLSELECT2AS[C1]FROM(SELECT1ASX)AS[SingleRowTable2])AS[UnionAll1]UNIONALLSELECT3AS[C1]FROM(SELECT1ASX)AS[SingleRowTable3])AS[UnionAll2]WHERE[UnionAll2].[C1]=[Extent1].[Id])正如DiegoBVega所说此处如本文(第二个答案)中所述,Contains现在应该可以在EF4中使用。我的解决方法是将实体结果转换为列表,然后应用Contains()。例子:以上是C#学习教程:如果不支持Contains,如何在LINQtoEntities(实体框架)中执行SQL风格的“IN”语句?所有分享的内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——varitems=db.InventoryItem.Include("Kind").Include("PropertyValues").Include("PropertyValues.KindProperty").ToList().Where(itm=>valueIds.Contains(itm.ID));本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢