【问题标题】:Linq to custom sqlLinq 到自定义 sql
【发布时间】:2017-04-02 19:32:34
【问题描述】:

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

【问题讨论】:

  • 使用Expression&lt;Func&lt;table, bool&gt;&gt;
  • 这在我做第二部分时有效。问题是我的主要问题是我有一个需要组合和执行的谓词列表。我该怎么做?

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


【解决方案1】:

尝试使用

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

代替:

temp2.Name.Contains("test string")

为此,您必须添加参考:

System.Data.Linq.SqlClient

【讨论】:

    【解决方案2】:

    如果你有一个新的List&lt;Expression&lt;System.Func&lt;table, bool&gt;&gt;&gt; 而不是一个新的List&lt;System.Func&lt;table, bool&gt;&gt;,那么你可以这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      相关资源
      最近更新 更多