好的,所以我有一个带有巨大表的数据库。超过100万条记录和50多列。 (我知道它不是最优的,但它是我必须使用的)所以我需要运行限制返回的数据量的查询。现在我的问题是这个。我有一些运行和返回数据的自定义查询。用户可以通过选择将生成Predicate模板并将其应用于列表的过滤器和选项来更多地过滤该数据。我现在需要获取谓词列表并将它们组合并重新查询数据库以搜索(更改或其他条目匹配)。问题是这个
private Func<table,bool> filterAll()
{
Func<table, bool> temp = null;
var list = mylist.filterList; //filterlist is a list<Predicate<table>>
var list2 = list.Select(val => val.Value).ToArray();
foreach(var a in list2)
{
temp += t => a(t);
}
return temp;
}
private void loadWithFiltersButton_Click(object sender, EventArgs e)
{
var temp = db.table.Where(filterAll());
}
我无法将谓词转换为可用的SQL查询。我得到一个例外,说它无法为Predicates列表生成sql。我也试过这个
Func<table, bool> query1 = temp2 => temp2.Name.Contains("test string");
Func<table, bool> query2 = temp2 => temp2.ignore == false;
var temp = db.table.Where(query1);
var myval = temp.Where(temp2 => temp2.Name.Contains("test string")).Select(val => val).ToList();
虽然确实执行了问题但是生成的sql会拉下整个表并且根本不生成where子句。
我一直在搜索并找到https://stackoverflow.com/questions/974719/how-to-use-linq-to-compile-a-lambda-expression-to-custom-sql-or-otherwise,但人们在答案中发布的所有链接对我来说都是死的。
所以基本上如何将多个谓词组合成一个可用的查询,让db返回尽可能少的数据?
编辑:尝试了这个Concatenating Lambda Functions in C#但它也抛出了无法生成sql查询的异常。
答案 0 :(得分:0)
尝试使用
SqlMethods.Like(temp2.Name, "test string")
而不是:
temp2.Name.Contains("test string")
为此,您必须添加引用:
System.Data.Linq.SqlClient
答案 1 :(得分:0)
如果您有新的List<Expression<System.Func<table, bool>>>
而不是新的List<System.Func<table, bool>>
,那么您可以执行类似
private void Test()
{
var list = new List<Expression<System.Func<table, bool>>>();
Expression<Func<table, bool>> query1 = temp2 => temp2.Name.Contains("test string");
Expression<Func<table, bool>> query2 = temp2 => temp2.ignore == false;
list.Add(query1);
list.Add(query2);
var temp = filterAll(list).ToList();
}
private System.Linq.IQueryable<table> filterAll(List<Expression<Func<table, bool>>> list2 )
{
var query = table.AsQueryable();
foreach (var a in list2)
{
query = query.Where(a);
}
return query;
}