C# LINQ动态Where-不添加子句

C# LINQ动态Where-不添加子句,c#,linq,C#,Linq,我有以下代码: public OTestTable GetTestCode(Func<TestTable, bool> whereClause) { return CoreContext.TestTables.Where(whereClause).Select(TestTableMap.DataToObject).FirstOrDefault(); } 在我的主程序中,我使用字符串值调用GetTestCode 当我观看SQL profiler时,我会看到以下内容: publ

我有以下代码:

public OTestTable GetTestCode(Func<TestTable, bool> whereClause)
{
    return CoreContext.TestTables.Where(whereClause).Select(TestTableMap.DataToObject).FirstOrDefault();
}
在我的主程序中,我使用字符串值调用GetTestCode

当我观看SQL profiler时,我会看到以下内容:

public OTestTable GetTestCode(string code)
{
    return QueryEngine.GetTestCode(id => id.mycode == code);
}
SELECT [t0].[mycode]
FROM [dbo].[TestTable] AS [t0]
它没有将where子句附加到SQL查询。如果我在DataContext.TestTable中将where子句作为var query=from c添加到LINQ,其中c.mycode==选择c

它将添加where子句

然而,当我运行代码时,它将返回正确的记录,但似乎我正在从数据库中提取所有记录,并在代码中过滤不应该发生的事情

有没有想过我做错了什么


感谢

为了构造SQL语句,LINQ to SQL需要一个表达式树。Func不表示表达式树,它是一个黑盒函数指针。LINQ除了在内存集合中盲目执行它之外,不能用它做任何智能的事情

您需要这样做:

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

此代码使用可查询的.Where扩展方法进行编译,该方法接受表达式树,而不是可枚举的.Where扩展方法,该方法只接受原始委托。

尝试将Where子句创建为:

Expression<Func<T, bool>> whereClause
其中,T参数是源类型表source

另请参见此处的PredicateBuilder:

它为您提供了方便的扩展方法来谓词IQueryable。像这样:

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

就这样!!我完全忘了用这个短语!!非常感谢!
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();