2011-06-02 35 views
0

我想包住SqlFunctions.IsNumeric函數,這樣我可以在其他層使用它,而無需添加參考System.Data的IsNumeric函數(不管原因)。
這裏是我做過什麼 - 在我的倉庫接口:裹SqlFunctions

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); 
    } 
} 

的問題是,現在之後,我公開的方法,我真的不知道如何使用它..
這是事端g像:

Customers.OrderBy(x=>**Order by is numeric on x.Name); 

任何想法?

+0

對不起,我不知道,但你能告訴我頭朝下的「=>」之稱,它有什麼作用?我沒有看到這個語法。 – mikey 2011-06-02 00:20:31

+0

@mikey:它實際上是λ表達式是句法suagr到代表語法。更多信息:http://msdn.microsoft.com/en-us/library/bb397687.aspx – Naor 2011-06-02 00:23:57

回答

0

類似的東西?

Customers.OrderBy(x=>RepositoryUtils.IsNumeric(x.Name)); 
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)); 
+0

@Centro:我得到的例外:此功能只能從LINQ調用到實體... – Naor 2011-06-02 00:47:30

+0

@Naor究竟在哪裏你有例外嗎? – Centro 2011-06-02 00:51:09

+0

@Centro:稍後我會查詢。計數()例如,這會引發異常。你的更新更好,但我仍然得到這個異常:此功能只能從LINQ到實體調用。 我正在使用lambda,異常說明我需要使用linq來代替實體。你知道如何解決這個問題,所以我可以使用lambda? – Naor 2011-06-02 01:17:46

0

我認爲它不會以這種方式工作。我相信這樣的表達本身就應該是這樣的:

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

不僅

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

是什麼。如果你想通過表達OrderBy你不及格:

.OrderBy(x => YourNewExpression(x)) 

你必須通過:

.OrderBy(YourNewExpression) 

這導致了可重用性的問題,因爲如果你想傳遞給string表達你只能在IQueryable<string>上使用它。我不確定它是否可以以某種方式調整工作。這只是解釋爲什麼它不起作用。