过滤IQueryable <dynamic>给定用户输入</dynamic>

时间:2012-10-31 17:57:18

标签: c# linq dynamic filtering

有没有办法做这样的事情:

//Create Connection.
NMBSReportViewer.Models.SchoolEntities db = new NMBSReportViewer.Models.SchoolEntities();

//Get the Data Using the Report's Stored QueryString.
String QueryString = report.Query; //"SELECT VALUE c FROM SchoolEntities.Courses AS c WHERE c.Credits > 0";
IQueryable<dynamic> data = db.CreateQuery<dynamic>(QueryString);

//Given String FieldName, String Operator, & String Value, from user, Filter the Above dataset.
data.Where(c => c.'FieldName' 'Operator' 'Value');

我假设上面没有任何东西,但有没有办法达到相同的最终结果? 我将为用户提供字段和运算符的下拉列表,然后他们将在文本框中为这三个值输入他们想要的值,因此FieldName应始终是集合中的可行字段。

LINQ中有没有办法做这样的事情? 如果没有办法做到这一点...... 有没有办法用只有字符串的静态类型“SchoolEntities.Course”来创建一个IQueryable?

2 个答案:

答案 0 :(得分:0)

你的意思是:

IQueryable<Course> data = db.CreateQuery<Course>(QueryString);

你也可以这样查询课程实体:

IQueryable<Course> data  = db.Course.Where(c => c.Credits > 0 && c.Name == "Bob");

答案 1 :(得分:0)

对于困惑感到抱歉,我认为实体框架毕竟不是一个选项。

最后,我想我必须使用这种方法,以便在每次数据库获得或丢失表时保持重新部署项目的自由。

static void Main(string[] args)
{
//Connection String
String ConnectionString = @"Data Source = localhost\SQLEXPRESS; Initial Catalog = School; Trusted_Connection=True;";

//Create the Connection
SqlConnection DbConn = new SqlConnection(ConnectionString);

//Open the Connection
DbConn.Open();

//Query String
String QueryString = "SELECT * FROM COURSE";

//Create the SqlCommand Object
SqlCommand QueryCommand = new SqlCommand(QueryString, DbConn);

//Use the SqlCommand to create the DataReader Object.
SqlDataReader QueryCommandReader = QueryCommand.ExecuteReader();

//Create the Datatable.
DataTable DataT = new DataTable();

//Load the Data into the Table.
DataT.Load(QueryCommandReader);

//Get the User Input
String Expression = "Credits > 3";

//Create DataRows and Filter Table.
List<DataRow> FilteredData = new List<DataRow>();
FilteredData = DataT.Select(Expression).ToList();
}

感谢您的帮助和信息。对不起,这不是一个明确的问题。