2009-11-30 66 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();