我是 EntityFramework 的新手,遇到了查询中使用的不受支持的函数的问题。因此,我希望社区可以帮助找到一种优雅的方式。
该查询尝试根据用户名和/或 Windows 用户名查找用户。
[Flags]
public enum IdentifierType
{
Username = 1,
Windows = 2,
Any = Username | Windows,
}
以下代码引发NotSupportedException,因为 Enum.HasFlag 无法转换为存储表达式。
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;
}
}
如果我以旧的方式重写查询,则查询有效,但布尔逻辑在数据库中执行:
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))))
如何强制框架在将布尔逻辑发送到数据库之前对其进行评估,因此二进制操作不在数据库级别完成?
任何想法都非常感谢!