1

アプリケーションをビルドするときに、愚かなステップで立ち往生しています。

私はlinq 2 sqlに簡単なクエリを持っています:

var recipients = cdc.Recipients.Where(r => r.Owner == Sanitize.SanitizeUserName(context.User.Identity.Name) && r.Enabled == true && (r.DisplayName.Contains(qs) || r.EmailAddress.Contains(qs)))
                                        .Select(r => new NVC { name = r.DisplayName, value = r.EmailAddress }).ToList();

受信者のテーブルにいくつかのデータを取り、カスタムクラスを配置します。ここではすべてスムーズです。

電子メール アドレスが有効かどうかを確認するには、where 句にフィルターを追加する必要があります。

単純な関数で試してみましたが、使用すると「no sql translation」例外がスローされました。

インターウェブを掘り下げると、拡張メソッドを使用する必要があることがわかったので、最終的にこれを構築します。

public static Expression<Func<string, bool>> IsSaneEmail = y => (!string.IsNullOrEmpty(y) && Regex.IsMatch(y, emailPattern));

(ここで、emailPattern は正規表現文字列です)

しかし、私のクエリに適用するにはどうすればよいですか? where句を追加しようとしました

... && IsSaneEmail(r.emailAddress) && ...

また

... && r.EmailAddress.IsSaneEmail() && ...

運がない。

私は私が愚かであることを知っていますが、私を助けてください

4

2 に答える 2

1

Linq2SQL でそれを行うことはできません (SQL に変換することはできません)。最初に IEnumerable に変換する必要があります。

于 2012-09-17T09:09:08.250 に答える
0

拡張メソッドは文字列クラスをターゲットにする必要があり、bool を返す必要があります。

public static bool IsSaneEmail(this string val) {
        return !string.IsNullOrEmpty(val) && Regex.IsMatch(val, emailPattern)
    }

それがソートされると、このメソッドを次のように呼び出すことができます。

r.EmailAddress.IsSaneEmail()
于 2012-09-17T09:07:22.440 に答える