Как адаптировать простое String Extension для поддержки SQL - PullRequest
2 голосов
/ 22 июня 2010

У меня есть расширение строки C #, которое действительно облегчает жизнь, но я получаю исключение:

Method 'System.String ToUrlString(System.String)' has no supported translation to SQL.

Я видел это как распространенную проблему, и некоторые люди нашли способы обойти этоэто для их метода, но я не уверен, что это возможно для моего.Это просто короткий путь, и я попытался использовать его и с регулярным выражением, и возникает то же исключение.

public static string ToUrlString(this String val)
{
    return val.Trim().ToLower().Replace(" ", "-").Replace(":", string.Empty);
}

Существуют ли дополнительные декораторы или способы, которыми я могу адаптировать этот код, чтобы он мог поддерживать SQL?Я вызываю это в предложении where в моих выражениях LINQ..ToTagString() не совсем тот же метод, что и .ToUrlString(), но он очень похож.

РЕДАКТИРОВАТЬ : В соответствии с предложением ниже, я попробовал кое-что еще, но я все еще получаюта же ошибка.

public IEnumerable<Post> GetPostsByTag(string tagName)
{
    var query = from p in db.Posts
           join pt in db.PostTags on p.PostID equals pt.PostID
           where pt.Tag.TagName.ToTagString().Equals( tagName.ToTagString() )
           orderby p.PostDate descending
           select p;

    var result = query.AsEnumerable();

    return from r in result
           select r;
}

Ответы [ 2 ]

1 голос
/ 22 июня 2010

Я думаю, вы можете создать UDF для выполнения необходимых операций со строками на уровне БД.http://msdn.microsoft.com/en-us/library/bb386973.aspx http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

  1. Создать UDF.Используйте функции LTRIM, RTRIM, LOWER, REPLACE.Примерно так.

    СОЗДАТЬ ФУНКЦИЮ dbo.ToUrlString (@string VARCHAR (MAX)) ВОЗВРАЩАЕТ VARCHAR (МАКС.) НАЧАТЬ ВОЗВРАТ ЗАМЕНИТЬ (ЗАМЕНИТЬ (НИЖЕ (LTRIM (RTRIM (@string)))), '', '- '),': ',' ') END

  2. Добавьте его в качестве метода в свой DataContext.Просто перетащите его из обозревателя серверов в конструктор L2S.

Надеюсь, это поможет.

1 голос
/ 22 июня 2010

Нет, вы не можете перевести это в SQL, по крайней мере, без реализации собственного поставщика LINQ TO SQL.

Проблема в том, что вы используете его внутри запроса Linq, поэтому он пытается перевести ваш метод на язык SQL.

LINQ использует IQueryable для перевода вашего выражения на язык SQL. Пока вы используете IQueryable (все сущности, возвращаемые из datacontext, реализуют IQueryable), все применяемые к нему методы будут преобразованы в SQL.

Чтобы избежать преобразования вашего пользовательского метода в SQL, вы должны сначала преобразовать выражение LINQ в IEnumerable, поэтому дальнейший перевод не произойдет:

public IEnumerable<String> Example()
{
     var query = from f in foos
            where f.Id == 'myId'
            select f;

     var result = query.AsEnumerable();

     return from r in result
            select r.Url.ToUrlString();
}

Надеюсь, это поможет!

...