System.Linq.Dynamic动态列名和参数

时间:2017-09-20 16:45:42

标签: c# asp.net-mvc linq

我是LINQ的新手。我需要执行动态操作,这似乎可以通过表达式树或动态库来完成。我选择使用System.Linq.Dynamic,因为它更快(此时)。我抬头看了看,但似乎没有什么可以解决我的问题。我在同一个问题上看到了几个堆栈帖子,但即使将我的代码更改为仍然没有解决。

我将两个字符串(列名,搜索参数)传递给我的控制器,它将执行查询并返回JSON对象。列名和搜索参数必须是动态的。

The SQL query i need to execute: 
SELECT top 50 c1, c2, c3 
FROM TableName
WHERE column_name LIKE '%search_parameter%';


var result = db.TableName
   .Where("@0.Contains(@1)", column_name, search_parameter)
   .Select("new(c1, c2, c3.)");

现在我只想选择那些特定的列,不用担心前50名。

我还尝试阅读System.Linq.Dynamic上的示例,但我认为我缺乏理解很多内容所需的基本知识。我会很感激一些指点。谢谢。

2 个答案:

答案 0 :(得分:1)

对于LIKE,您可以使用Contains

,

要选择linq中的3列,请使用此

column_name.Contains(search_parameter)

要获得前50名,只需使用

.Select(x=> new { x.c1,x.c3,x.c3 })

所以基本上

.Take(50)

修改

如果您需要执行动态SQL,可以使用SqlQuery这样的东西

var result = db.TableName.Where(x => x.column_name.Contains(search_parameter)).Select(x=> new { x.c1,x.c3,x.c3 }).Take(50);

编辑2

如果您有安全问题,可以使用存储过程

string query = string.format("SELECT TOP 50 c1, c2, c3 
FROM TableName WHERE {0} LIKE '%{1}%'",column_name,search_parameter);
var result = db.Database.SqlQuery<YOURRESULTCLASS>(query);

编辑3

由于示例代码使用System.Linq.Dynamics,因此该代码应该可以正常工作

db.Database.SqlQuery<YOURRESULTCLASS>("storedProcedureName",params);

这是整个控制台应用程序,因此您可以测试代码

string column_name = "name";
            string column_value = "C";
            string where = string.Format("{0}.Contains(@0)", column_name); //first create the where clause with the column name
            var result = Courses.Where(where,column_value).Select("new(name,courseID)").Take(50);   //here apply the column value to the name

答案 1 :(得分:0)

文档不是很清楚,但我认为参数替换只支持值,而不支持列名。虽然有风险,但如果您信任源,则可以使用插值来插入列名:

var result = db.TableName
   .Where($"{column_name}.Contains(@0)", search_parameter)
   .Select("new(c1, c2, c3)");