2014-10-22 4 views
0

Я занимаюсь этим довольно долгое время и не могу найти решение. Я Первоначально Пробовал форматировать динамический оператор Linq, как вы можете видеть here в этом постеФорматирование инструкции выбора с использованием динамического 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 в predefinedTypes

,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.

ответ

1

Ошибка сообщение довольно сам пояснительный. База данных не знает, как перевести этот метод в SQL. Вам нужно получить информацию о том, что метод нуждается в запросе базы данных, а затем вызвать эту функцию для результатов, а не в запросе.

+0

Это кажется логичным, он просто не имеет смысла, потому что я расширил библиотеку таким же образом, так что бы бы работа с функцией IList Содержит. Может быть, SQL как-то знает об этой функции, или LinqToEntities может найти способ ее перевести. Как вы предлагаете мне это исправить? –

+1

@ johnny5 Вы не сможете найти способ для EF перевести его. Вам нужно выполнить функцию на стороне приложения после выполнения вашего запроса, как я сказал в своем ответе. – Servy

+0

Entity Framework не поддерживает эту функцию. Он поддерживает конкатенацию. Возможно, вы знаете способ просто добавить некоторые данные к результатам, т.е. LinqToEntities поддерживает. .Select (t => new {FML = t.ExtTitleID + "EXTRATEXT"}) «Как я могу сделать это динамически, пожалуйста? –

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> объект вместо динамического объекта (потому что я никогда раньше не было необходимости для динамических объектов), так что вы можете настроить его соответствующим образом.

+0

Это используется для создания динамических отчетов, оператор выбора должен быть динамическим, поэтому я могу иметь соответствующие форматированные столбцы. У меня есть отображение правильных столбцов, которые просто не отформатированы.Если я буду делать это динамически, то после ToList я не буду иметь раннюю привязку к оператору Second Select. Любой способ решить эту проблему динамически? –

+1

Форматирование столбцов * не должно решаться оператором sql *. Технологии баз данных предназначены для хранения и извлечения данных. Приложения, которые обращаются к данным, должны форматировать их по мере необходимости. Например, сохранение DateTime в базе данных в определенном TimeZone является ужасной идеей, потому что это не подходящее время для тех, кто находится за пределами этого часового пояса. Таким образом, он должен быть сохранен как UTC, а затем преобразован/отформатирован для конечного пользователя по мере необходимости. –

0

Я только что решил аналогичную проблему несколько часов назад.

YOu need 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); 
+0

Спасибо за ответ. Проблема, связанная с тем, что я ранее разрешал, как System.Collections.IEnumerable), позволяет вам впоследствии перейти к динамическому. ToAnonymousList не будет работать, потому что после этого оператор Select может принимать только Iqueryable, тогда как ToAnonymouslist возвращает IList –

+0

@ johnny5, это не обязательно так. 'Select' также работает с' IEnumerable', а 'IList' -' IEnumerable'. –

+0

Текущая динамическая библиотека Linq поддерживает только IQueryable и IQueryable , вы можете легко ее расширить, чтобы поддерживать IEnumerable –

Смежные вопросы