2016-11-18 75 views
2

好吧,我有一个巨大的表db。超过100万条记录和超过50列。 (我知道它不是最优的,但它的工作原理)所以我需要运行限制返回数据量的查询。现在我的问题是这样的。我有一些自定义查询运行并返回数据。用户可以通过选择将生成Predicate模板的过滤器和选项并将其应用于列表来更多地过滤该数据。我现在需要获取谓词列表并合并它们并重新查询数据库来搜索(更改或其他条目匹配)。问题是这样的Linq自定义sql

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查询的异常。

+1

使用'表达式>'。 –

+0

这在我做第二部分时很有用。事情是我的主要问题是我有一个Predicates列表,我需要组合和执行。我怎样才能做到这一点? – lesyriad

回答

0

使用

SqlMethods.Like(temp2.Name, "test string") 

,而不是尝试:如果你有一个新的List<Expression<System.Func<table, bool>>>而不是

System.Data.Linq.SqlClient 
0

temp2.Name.Contains("test string") 

为了做到这一点,你必须添加引用一个新的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; 
}