包装SqlFunctions的IsNumeric函数
本文关键字:函数 IsNumeric SqlFunctions 包装 | 更新日期: 2023-09-27 17:58:17
我想包装SqlFunctions.IsNumeric函数,这样我就可以在其他层中使用它,而无需添加对System.Data的引用(无论为什么)
以下是我所做的-在我的存储库接口中:
public interface IUtils
{
Expression<Func<bool>> IsNumeric(string str);
}
在我的ef层中:
public class EFUtils : IUtils
{
public Expression<Func<bool>> IsNumeric(string str)
{
return () => SqlFunctions.IsNumeric(str) == 1;
}
}
在我以后的业务中:
public class RepositoryUtils
{
protected static IUtils Utils { get; set; }
static RepositoryUtils()
{
Utils = ObjectFactory.GetInstance<IUtils>(); //Using structureMap
}
public static Expression<Func< bool>> IsNumeric(string str)
{
return Utils.IsNumeric(str);
}
}
问题是,现在,在我暴露了这个方法之后,我真的不知道如何使用它。
它有点像:
Customers.OrderBy(x=>**Order by is numeric on x.Name);
知道吗?
类似的东西?
Customers.OrderBy(x=>RepositoryUtils.IsNumeric(x.Name));
RepositoryUtils
返回Expression<Func<bool>>
,所以应该是这样的:
Customers.OrderBy(x => RepositoryUtils.IsNumeric(x.Name).Compile()());
通过这段代码,您可以编译lambda表达式,然后调用它。
UPD我不知道Expression<Func<bool>>
被用于什么目的。我会用一个简单的bool:
public class EFUtils : IUtils
{
public bool IsNumeric(string str)
{
return SqlFunctions.IsNumeric(str) == 1;
}
}
public class RepositoryUtils
{
protected static IUtils Utils { get; set; }
static RepositoryUtils()
{
Utils = ObjectFactory.GetInstance<IUtils>(); //Using structureMap
}
public static bool IsNumeric(string str)
{
return Utils.IsNumeric(str);
}
}
那么lambda表达式将更简单:
Customers.OrderBy(x => RepositoryUtils.IsNumeric(x.Name));
我认为它不能以这种方式工作。我相信这个表达本身应该是这样的:
Expression<Func<T, bool>> YourNewExpression(T something)
不仅仅是
Expression<Func<bool>> YourNewExpression(T something)
那没什么。如果要将表达式传递给OrderBy
,则不传递:
.OrderBy(x => YourNewExpression(x))
您必须通过:
.OrderBy(YourNewExpression)
这导致了可重用性方面的问题,因为如果要将string
传递给表达式,则只能在IQueryable<string>
上使用它。我不确定它是否可以以某种方式调整以发挥作用。这只是解释为什么它不起作用。