好吧,我有一个带有巨大表的数据库。超过 100 万条记录和 50 多个列。 (我知道它不是最佳的,但它是我必须使用的)所以我需要运行限制返回数据量的查询。现在我的问题是这个。我有一些运行和返回数据的自定义查询。用户可以通过选择将生成谓词模板并将其应用于列表的过滤器和选项来进一步过滤该数据。我现在需要获取谓词列表并将它们组合起来,然后重新查询数据库以搜索(更改或其他条目匹配)。问题是这个
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 查询。我得到一个异常,说它无法为谓词列表生成 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但是人们在答案中发布的所有链接对我来说都是死的。
那么基本上我怎样才能将多个谓词组合成一个可用的查询,使数据库返回尽可能少的数据量?
编辑:也试过这个Concatenating Lambda Functions in C#但是也抛出无法生成sql查询的异常。
最佳答案
尝试使用
SqlMethods.Like(temp2.Name, "test string")
代替:
temp2.Name.Contains("test string")
为此,您必须添加引用:
System.Data.Linq.SqlClient
关于c# - Linq 到自定义 sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40685715/