Linq来自定义sql

时间:2016-11-18 20:48:50

标签: c# sql linq linq-to-sql

好的,所以我有一个带有巨大表的数据库。超过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查询的异常。

2 个答案:

答案 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;
}