Linq to Sql поддерживает мой строковый запрос, но не в свойстве. Могу ли я сделать это? - PullRequest
2 голосов
/ 14 ноября 2009

У меня есть класс с заголовком. У меня есть свойство, которое возвращает этот заголовок, немного скорректированный. Если я выполняю запросы Linq to Sql от скорректированного свойства title, я получаю исключение «не поддерживается». Если я делаю то же самое, свойство делает непосредственно в запросе linq, оно работает. Любые идеи о том, как я могу заставить собственность работать в Linq to Sql?

Вот свойство

public string SeoName
{
    get { return Name.ToLower().Replace(" ", "").Replace("&", "and"); }
}

Вот запрос, который не работает (что я хотел бы сделать).

var series = from s in videoRepo.GetShows()
             where s.Topic.SeoName.Equals(topicSeoName)
             select s;

Вот запрос, который делает то же самое и работает

var series = from s in videoRepo.GetShows()
            where s.Topic.Name.ToLower().Replace(" ", "")
            .Replace("&", "and").Equals(topicSeoName)
            select s;

Как мне структурировать свойство top для работы с первым запросом linq?

МОЙ ФИНАЛЬНЫЙ ОТВЕТ

Добавлено выражение для оценки того, что я искал

public static Expression<Func<Show, bool>> 
        TopicSeoNameEquals(string name)
    {
        return t => t.Topic.Name.ToLower().
            Replace(" ", "").Replace("&", "").Equals(name);
    }

Тогда я просто назвал это немного по-другому в запросе linq

var test = Show.TopicSeoNameEquals(topicSeoName);

var series = from s in videoRepo.GetShows().Where(test)
            select s;

Ответы [ 2 ]

2 голосов
/ 14 ноября 2009

Взгляните на LinqKit - у него есть кое-что для того, чтобы одно выражение вызывало другое, и т. Д. Я использую PredicateBuilder очень много.

2 голосов
/ 14 ноября 2009

В принципе, вы не можете. LINQ to SQL не может «заглянуть внутрь» свойства SeoName и перевести его в SQL. Однако, когда вы пишете то, что выглядит как тот же код, встроенный в запрос LINQ to SQL, компилятор строит его так, чтобы LINQ to SQL мог «заглянуть внутрь». Он создает дерево выражений - абстрактное описание последовательности операций в запросе - вместо компиляции кода до MSIL.

Вы можете обойти это, создав Expression, которая выполняет ту же работу, что и SeoName, но вы все равно в конечном итоге продублируете код SeoName, чтобы заставить C # скомпилировать одну копию как вызываемый метод MSIL, а другую - как дерево выражений. , (Хотя вы можете обойти this , если ваше свойство SeoName будет работать путем компиляции дерева выражений во время выполнения: это позволяет обойти дублирование за счет некоторой производительности и выглядит немного странно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...