Форматирование оператора Select с использованием Dynamic Linq
Я уже давно занимаюсь этим и не могу найти решение. Я изначально пробовал форматирование Динамическое заявление linq, как вы можете увидеть здесь в этом посте
Я объявил класс:
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
У меня есть программа, которая пытается вызвать FormattedLink внутри динамического выбора linq:
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();
}
Когда я выполняю эту программу, я получаю исключение во время выполнения: "LINQ to Entities не распознает метод метода System.String FormattedLink(System.String, Int32)", и этот метод нельзя преобразовать в выражение хранилища ".
Любые идеи о том, как это исправить... Мне просто нужно простое форматирование из Dynamic Select.
3 ответа
Сообщение об ошибке довольно очевидно. База данных не знает, как перевести этот метод в SQL. Вам нужно получить информацию, которая нужна методу, в запросе к базе данных, а затем вызвать эту функцию в результатах, а не в запросе.
Я не уверен, почему вам нужно, чтобы он был динамичным, кажется, что решение, которое вы представляете, является слишком сложным. Я бы написал это так:
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>
объект вместо динамического объекта (потому что у меня никогда не было потребности в динамических объектах), так что вы можете настроить его соответствующим образом.
Я только что решил похожую проблему несколько часов назад.
Тебе нужно ToList()
это работает с динамическим linq. Проверить эту тему: Не удается найти свойство или поле в динамическом объекте
Просто скопируйте и вставьте их в свой проект, а затем:
var TOrigin = (Model.Titles.Where("ID > 19632")
.ToAnonymousList()
.Select("new(ID, @0.FormattedLink(ExtTitleID, ID) as
ExtTitleID )", Dh) as System.Collections.IEnumerable);