Форматирование оператора 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);
Другие вопросы по тегам