如何在c#MVC3中执行字符串格式的LINQ查询

时间:2013-05-28 14:23:32

标签: c# asp.net-mvc linq-to-sql

     public ActionResult GenerateReport(FormCollection Form)
        {
            var type_id = Form["type_id"];           
            var Start_Date = Form["Start_Date"];

            StringBuilder sb = new StringBuilder();          
            sb.Append("db.contracts.Where(");
            if (!type_id.Equals(null))
            {
                sb.Append("a => a.type_id == type_id");
            }

            if (!Start_Date.Equals(null))
            {
                sb.Append("&& a => a.Start_Date == Start_Date");
            }
            sb.Append(");");
           //here I need to run the query!!
            return View(cm);
        }

如何在C#中执行此LINQ查询, 我只想运行查询并获得结果..

请帮帮我......

提前致谢...

3 个答案:

答案 0 :(得分:1)

编辑:此答案适用于原始问题内容,​​如何从字符串中执行此LINQ表达式:

var expression = @"( from a in Assignments
    where a.assignmentID == 1 && a.assignmentID == 4 )
    select new AssignmentModel
    {
        Title = a.Title,
        Description = a.Description
    }).ToList()";

虽然这个答案应该适用于当前问题中生成的字符串,但只有你会注入db.contracts而不是Assignments,正如我在下面解释的那样。


使用编译类的替代方法@GekaLlaur建议将字符串编译为表达式树,在编译LINQ表达式时,这可能更合适。

this SO post (Chosen Solution)中找到的解决方案看起来好像应该为您开箱即用,只使用var p = Expression.Parameter(typeof(List<AssignmentModel>), "Assignments");来描述您的参数。我会用你的具体例子测试它,但我还没有库(linked here)。

答案 1 :(得分:1)

不要这样做。改为使用Predicate Builder!

简而言之,这是C#的一个很棒的实现: http://www.albahari.com/nutshell/predicatebuilder.aspx

谓词构建器使用名为linqkit的免费库: http://www.albahari.com/nutshell/linqkit.aspx

这是另一个解决这个主题以及整个过程如何运作的问题 How does PredicateBuilder work

答案 2 :(得分:0)

检查CodeDOM,它提供了以编程方式创建代码的能力

http://msdn.microsoft.com/en-gb/library/y2k85ax6.aspx

然后你可以用反射来执行它。

或者

您可以使用表达式树以编程方式生成代码。

这篇文章非常有用http://msdn.microsoft.com/en-us/library/vstudio/bb882637.aspx