我一直在研究这个问题已经有一段时间了,无法找出解决方案。我最初尝试格式化动态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;
有关如何解决此问题的任何想法...我只需要动态选择中的简单格式化。
答案 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);