具有泛型类属性的LINQ表达式我想将一个IQueryable和一个id数组传递给一个方法,该方法根据这些id过滤IQueryable。由于id可以是long或int,这通常应该可以解决。我想出了以下内容:publicstaticIEnumerableGetModified(IQueryableobjects,TId[]ids)whereT:class{returnobjects.Where(j=>ids.Contains((TId)j.GetType().GetProperty("Id").GetValue(j)));}不幸的是,我遇到了异常:LINQtoEntities无法识别“System.ObjectGetValue(System.Object)”方法,并且此方法无法转换为存储表达式。异常是正常的,因为通过反射获取属性显然不会转换为SQL。我会尝试的一件事是创建一个公共接口,公开给定类型的Id属性:publicinterfaceHasId{TId{get;类型是整数。下一步是修改您的方法,如下所示:}请注意添加的通用限制:whereT:class,HasId。这允许您编写一个简化的j.Id,它返回一个TId值,而不是求助于反射。请注意,我没有运行或测试此代码;这只是我看到你的问题时的一个想法,我希望它能有所帮助。更新:这是另一种可能的解决方案,不需要您以任何方式声明接口或更改类:publicstaticIEnumerableGetModified(IQueryableobjects,TId[]ids,Expression>idSelector)whereT:class{returnobjects.其中(j=>ids.Contains(idSelector(j)));我在这里做的是添加Expression>idSelector参数,这个表达式可以返回给定T实例的Id。您可以这样调用该方法:varmodified=GetModified(dbObjects,yourIdArray,entity=>entity.Id);(只有第三个参数是新的;保持其他参数不变)。同样,我没有测试这是否有效,甚至没有编译,因为我这里没有带VS的计算机:(。实体框架不支持某些.NET方法,如GetValue(),因为它不转换为SQL(这才是真正执行到IQueryable的代码。尝试在反射前调用ToList获取CLR对象:以上就是C#学习教程的全部内容:LINQexpressionswithgenericsclassattributes如果对大家有用需要想了解更多C#学习教程,希望大家关注——publicstaticIEnumerableGetModified(IQueryableobjects,TId[]ids)whereT:class{returnobjects.ToList().Where(j=>ids.Contains((TId)j.GetType().GetProperty("Id").GetValue(j)));}本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除,转载请注明出处:
