2016-11-18 76 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; 
}