包装SqlFunctions的IsNumeric函数

时间:2011-06-02 00:06:15

标签: c# .net entity-framework

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

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

那样的东西?

Customers.OrderBy(x=>RepositoryUtils.IsNumeric(x.Name));

答案 1 :(得分:0)

RepositoryUtils会返回Expression<Func<bool>>,所以它应该是这样的:

Customers.OrderBy(x => RepositoryUtils.IsNumeric(x.Name).Compile()());

通过此代码编译lambda表达式然后调用它。

UPD。我没有看到使用Expression<Func<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));

答案 2 :(得分:0)

我认为这不起作用。我相信表达本身应该是这样的:

Expression<Func<T, bool>> YourNewExpression(T something)

不仅

Expression<Func<bool>> YourNewExpression(T something)

没什么。如果您想将表达式传递给OrderBy,则不会传递:

.OrderBy(x => YourNewExpression(x))

你必须通过:

.OrderBy(YourNewExpression)

这会导致可重用性问题,因为如果您想将string传递给表达式,则只能在IQueryable<string>上使用它。我不确定它是否可以某种方式调整工作。这只是解释为什么它不起作用。