包装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);

知道吗?

包装SqlFunctions的IsNumeric函数

类似的东西?

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>上使用它。我不确定它是否可以以某种方式调整以发挥作用。这只是解释为什么它不起作用。