私はEntityFrameworkを初めて使用し、クエリで使用されるサポートされていない関数の問題に遭遇しました。したがって、コミュニティがエレガントな方法を見つけるのに役立つことを願っています。
クエリは、ユーザー名やWindowsユーザー名に基づいてユーザーを見つけようとします。
[Flags]
public enum IdentifierType
{
Username = 1,
Windows = 2,
Any = Username | Windows,
}
次のコードは、Enum.HasFlagをストア式に変換できないため、 NotSupportedExceptionをスローします。
public User GetUser(IdentifierType type, string identifier, bool loadRelations = false)
{
using (var context = contextFactory.Invoke())
{
var user = context.Users.FirstOrDefault(u => u.Username == identifier && type.HasFlag(IdentifierType.Username)
|| u.WindowsUsername == identifier && type.HasFlag(IdentifierType.Windows));
return user;
}
}
クエリを古いファッションの方法で書き直すと、クエリは機能しますが、ブール論理はDBで実行されます。
public User GetUser(IdentifierType type, string identifier, bool loadRelations = false)
{
using (var context = contextFactory.Invoke())
{
var user = context.Users.FirstOrDefault(u => u.Username == identifier && (type & IdentifierType.Username) == IdentifierType.Username
|| u.WindowsUsername == identifier && (type & IdentifierType.Windows) == IdentifierType.Windows);
return user;
}
}
WHERE((Username = @username)AND(1 =(3&(1))))OR(WindowsUsername = @windowsusername)AND(2 =(3&(2))))
DBに送信される前にフレームワークにブール論理を評価させて、二項演算がDBレベルで実行されないようにするにはどうすればよいですか?
どんなアイデアでも大歓迎です!