2

请看下面:

public Content GetContentByPageTitle(string pageTitle)
{
    return _db.Contents.FirstOrDefault(
            x => hnUrlHelper.UrlSafe(x.PageTitle).Equals(pageTitle)
        );
}


public class hnUrlHelper
{
    public static string UrlSafe(string value)
    {
        if (!string.IsNullOrEmpty(value))
        {
            value = value.Replace("Š", "s");

            value = value.Trim().ToLower();

            value = value.Replace(" ", "-");

            value = Regex.Replace(value, @"[^A-Za-z0-9-_]", "");

            return value.Trim().ToLower();
        }
        return string.Empty;
    }
}

“/”应用程序中的服务器错误。LINQ to Entities 无法识别方法 'System.String UrlSafe(System.String)' 方法,并且此方法无法转换为存储表达式。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NotSupportedException:LINQ to Entities 无法识别方法“System.String UrlSafe(System.String)”方法,并且此方法无法转换为存储表达式。

源错误:

我正在尝试在 Linq 语句中制定 UrlSafe 方法。这显示如下错误。有没有人知道如何证明这可以正常工作?

4

2 回答 2

0

您可以在大多数情况下使用扩展方法,但我认为您不能为正则表达式部分做点什么。

我能做到的最好的就是这样。

public static T FirstOrDefaultUrlSafe<T>(this IQueryable<T> queryable, Expression<Func<T, string>> propertyExpression, string pageTitle)
        {
            var parameter = propertyExpression.Parameters[0];
            var propertyName = (propertyExpression.Body as MemberExpression).Member.Name;
            Expression body = parameter;
            body = Expression.Property(body, propertyName);
            body = Expression.Call(body, "Replace", null, new[] { Expression.Constant("Š"), Expression.Constant("s") });
            body = Expression.Call(body, "ToLower", null);
            body = Expression.Call(body, "Trim", null);
            body = Expression.Call(body, "Replace", null, new[] { Expression.Constant(" "), Expression.Constant("-") });
            body = Expression.Equal(body, Expression.Constant(pageTitle));
            var lambda = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
            return queryable.FirstOrDefault(lambda);
        }

在您的情况下使用:

return _db.Contents.FirstOrDefaultUrlSafe(x => x.PageTitle, pageTitle)
于 2013-05-02T13:14:26.487 回答
0

异常告诉你你的方法不能被翻译成 SQL。在这种情况下,没有办法修复它,因为使用的方法Regex也不能翻译成 SQL。

修复此类异常的常用方法是使用返回表达式的属性或方法:

Expression<Func<Content,bool>> EqualsUrl(string url)
{
    return c => c.PageTitle.Replace("Š", "s") == url;
}

像这样调用:

_db.Contents.FirstOrDefault(EqualsUrl(pageTitle))

只要您使用Replace,ToLower和EF可以转换为 SQL 的Trim类似方法就可以了。但是,如前所述,这里是表演的终结者。Regex

于 2013-05-02T12:55:55.903 回答