C# 创建等于int32的IQueryable?
我正在尝试创建一个查询扩展,它将比较一个可为null的int-sql列值和一个值。但我已经挣扎了8个多小时才找到有效的解决方案 我已经在这方面找到了很多帮助。但所有这些话对我都没有帮助 我已经多次修改代码,但似乎没有任何效果。我想创建类似于ManagerID在(10,20,30)中的位置的东西 主代码C# 创建等于int32的IQueryable?,c#,entity-framework,iqueryable,C#,Entity Framework,Iqueryable,我正在尝试创建一个查询扩展,它将比较一个可为null的int-sql列值和一个值。但我已经挣扎了8个多小时才找到有效的解决方案 我已经在这方面找到了很多帮助。但所有这些话对我都没有帮助 我已经多次修改代码,但似乎没有任何效果。我想创建类似于ManagerID在(10,20,30)中的位置的东西 主代码 IQueryable<Users> query = _context.CreateObjectSet<Users>(); query = query.IsMember(a
IQueryable<Users> query = _context.CreateObjectSet<Users>();
query = query.IsMember(a => a.ManagerID, new Int32?[] { 10,20,30 });
return query.ToList();
对于基于字符串的Like和Equals,它工作得很好。但是想要(可为空的)整数有一个类似的乘积吗
我受到以下帖子的启发。它创建了一个搜索功能(为了让我的项目喜欢,我重命名了该功能)
我想创造其他类似的。最后一个布尔值用于验证列中是否允许为null
使用扩展的原因是,我的过滤器页面中也有很多过滤器。
有了这个扩展,我可以很容易地在Like和Equal函数的开头检查是否给出了一个过滤器,而不检查我的过滤器是否有20x的值
public static IQueryable<T> Like<T>(this IQueryable<T> source, Expression<Func<T, string>> stringProperty, string searchTerm, bool isnullValueAllowed)
if (String.IsNullOrEmpty(searchTerm))
{
return query;
}
publicstaticiqueryable-Like(此IQueryable源代码、表达式stringProperty、字符串searchTerm、bool isnullValueAllowed)
if(String.IsNullOrEmpty(searchTerm))
{
返回查询;
}
不清楚为什么要创建此扩展,因为您可以简单地编写如下内容:
query.Where(user=>(new[]{10,20,30}).Contains(user.ManagerId)).ToList();
但是,假设实际用例比您给出的示例稍微复杂一些,您能否将表达式构造为与常量Int32的比较或与null的比较,这取决于
searchTerm.HasValue()
是真的吗?这里需要使用相等运算符=
而不是等于方法。它实际上使表达式代码变得更简单:
foreach (var searchTerm in searchTerms)
{
var comparison = Expression.Equals(stringProperty.Body,
Expression.Constant(searchTerm));
orExpression = BuildOrExpression(orExpression, comparison);
}
当然,正如其他人提到的,您不需要构建一个表达式来表示这些比较中的一个或,您只需在lambda中的集合上使用Conatains
,查询提供程序就会为您完成所有这一切。为什么不使用这个query.Where(a=>(new Int32?[{10,20,30})。Contains(a.ManagerID)
?…我刚问了一下,我发现Int32?没有嵌入Equal函数。是否可以创建一个扩展名,该扩展名的处理方式与string.Equal类似?@Cedric肯定会的。
public static IQueryable<T> Like<T>(this IQueryable<T> source, Expression<Func<T, string>> stringProperty, string searchTerm, bool isnullValueAllowed)
if (String.IsNullOrEmpty(searchTerm))
{
return query;
}
foreach (var searchTerm in searchTerms)
{
var comparison = Expression.Equals(stringProperty.Body,
Expression.Constant(searchTerm));
orExpression = BuildOrExpression(orExpression, comparison);
}