2009-11-30 47 views
2

我有以下代碼:LINQ動態凡 - 不增加條款

public OTestTable GetTestCode(Func<TestTable, bool> whereClause) 
{ 
    return CoreContext.TestTables.Where(whereClause).Select(TestTableMap.DataToObject).FirstOrDefault(); 
} 

CoreContext是

我TestTableMap如下我的數據上下文(在基類初始化):

public class TestTableMap 
{ 
    public static readonly Func<TestTable, OTestTable> DataToObject = mapper => 
     new OTestTable 
     { 
      Code = mapper.mycode 

     }; 
} 

然後在我的商業方法,我有以下幾點:

public OTestTable GetTestCode(string code) 
{ 
    return QueryEngine.GetTestCode(id => id.mycode == code); 
} 

從我的主程序中,我使用字符串值調用GetTestCode。

當我看SQL事件探查器,我得到如下:

SELECT [t0].[mycode] 
FROM [dbo].[TestTable] AS [t0] 

它不必附加到SQL查詢的WHERE子句。如果我將where子句添加到LINQ中作爲var query = from DataContext.TestTable其中c.mycode ==''select c;

它會添加where子句。但是,當我運行我的代碼時,它將返回正確的記錄,但它好像是從數據庫中撤回所有記錄並在代碼中進行篩選(不應該發生這種情況)。

任何想法與我做錯了什麼?

謝謝

回答

3

爲了構建SQL語句,LINQ to SQL需要一個表達式樹。 Func<TestTable, bool>不代表表達式樹,它是一個「黑匣子」函數指針。除了在內存集合上盲目執行它之外,LINQ不能做任何事情。

你需要做這個:

public OTestTable GetTestCode(Expression<Func<TestTable, bool>> whereClause) { 
    return CoreContext.TestTables.Where(whereClause).Select(TestTableMap.DataToObject).FirstOrDefault(); 
} 

此代碼編譯使用Queryable.Where擴展方法,它接受一個表達式樹,而不是Enumerable.Where擴展方法,只接受原委託。

+0

那就是它!我完全忘記了使用Expression!謝謝一堆! – CodeLikeBeaker 2009-11-30 20:02:52

2

嘗試創建where子句爲:

Expression<Func<T, bool>> whereClause 

當T參數是源型Table<T> source

0

另請PredicateBuilder這裏:http://www.albahari.com/nutshell/predicatebuilder.aspx

它爲您提供便捷的擴展方法的謂詞IQueryable<T>。像這樣:

var predicate = PredicateBuilder.True<Family>(); 
predicate = predicate.And(o => o.Birthday < new DateTime(1980, 1, 1)); 
        .Or(o => o.Name.Contains("ke")); 
var result = Source.Where(predicate).ToList();