使用Dynamic Linq格式化Select语句

时间:2014-10-22 20:02:36

标签: c# sql-server linq entity-framework dynamic-linq

我一直在研究这个问题已经有一段时间了,无法找出解决方案。我最初尝试格式化动态linq语句,你可以在这篇文章中看到here

我宣布了一个班级:

public class DynamicHelper
{
    public string FormattedLink(string DisplayText, string ID)
    {
        return "<a href='/Title/Preview/'" + ID + ">" + DisplayText + "</a>";
    }

    public string FormattedLink(string DisplayText, int ID)
    {
        return "<a href='/Title/Preview/'" + ID + ">" + DisplayText + "</a>";
    }
}

将DynamicLinq中的新类型插入预定义类型

,typeof(DynamicHelper) //around line 635

我有一个试图在动态linq选择中调用FormattedLink的程序:

using (var Model = new MK3Entities())
{
    DynamicHelper Dh = new DynamicHelper();

    var TOrigin = (Model.Titles.Where("ID > 19632")
                               .Select("new(ID,  @0.FormattedLink(ExtTitleID, ID) as ExtTitleID )", Dh) as System.Collections.IEnumerable)
                               .Cast<dynamic>().Take(10).ToList();

    Console.ReadKey();
} 

当我执行这个程序时,我得到一个运行时异常&#34; LINQ to Entities无法识别方法&#39; System.String FormattedLink(System.String,Int32)&#39;方法,并且此方法无法转换为商店表达式。&#34;

有关如何解决此问题的任何想法...我只需要动态选择中的简单格式化。

3 个答案:

答案 0 :(得分:1)

错误消息非常自我解释。数据库不知道如何将该方法转换为SQL。您需要获取方法在数据库查询中需要的信息,然后在结果上调用该函数,而不是在查询中。

答案 1 :(得分:0)

我不确定为什么你需要它是动态的,看来你提出的解决方案非常复杂。我会把它写成:

using (var Model = new MK3Entities())
{
    DynamicHelper Dh = new DynamicHelper();

    var TOrigin = Model.Titles
      .Where("ID > 19632")
      .Select(t => new { ID = t.ID, ExtTitleID = t.ExtTitleId })
      .Take(10)
      .ToList() // Execute SQL Statement
      .Select(t => new {ID = t.ID, Link = nh.FormattedLink(ExtTitleID, ID)})
      .ToList();

    Console.ReadKey();
} 

我正在返回List<anonymous'1>对象而不是动态对象(因为我从未需要动态对象),因此您可以相应地调整它。

答案 2 :(得分:0)

我几个小时前就解决了类似的问题。

你需要ToList()与Dynamic linq一起使用。看看这个主题:Can't find property or field on a dynamic object

只需将这些粘贴到您的项目中,然后再粘贴:

var TOrigin = (Model.Titles.Where("ID > 19632")
                    .ToAnonymousList()
                    .Select("new(ID,  @0.FormattedLink(ExtTitleID, ID) as
                         ExtTitleID )", Dh) as System.Collections.IEnumerable);