我是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上的示例,但我认为我缺乏理解很多内容所需的基本知识。我会很感激一些指点。谢谢。
答案 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)");