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

この例外は、メソッドを SQL に変換できないことを示しています。この場合、メソッドはSQL に変換できない which を使用するため、修正する方法はありません。Regex

このような例外を修正する一般的な方法は、式を返すプロパティまたはメソッドを用意することです。

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

次のように呼ばれます:

_db.Contents.FirstOrDefault(EqualsUrl(pageTitle))

ReplaceToLowerTrimおよび EFがSQL に変換できる同様のメソッドを使用している限り、問題ありません。しかし、言ったように、Regexここでショー ストッパーです。

于 2013-05-02T12:55:55.903 に答える
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 に答える