我想包装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);
有什么想法吗?
答案 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>
上使用它。我不确定它是否可以某种方式调整工作。这只是解释为什么它不起作用。