entity-framework-core - EF Core 2.1 按自有类型过滤
问题描述
我正在开发一个使用 Entity Framework Cor 2.1 和 Aspnet Core Web API 的项目。
我有以下 ValueObject
public class Email
{
private string _value;
private Email(string value) => _value = value;
public static Email Create(string email)
{
//... code hidden for clarity
return new Email(email);
}
// I have overridden equality operators to check equality by the _value property
// and also ToString to return _value
}
我将此值对象配置为 Person 实体中的自有类型。
public class Person
{
//... code hidden for clarity
public virtual Email Email {get; private set;}
}
当我用say查询数据库时
_context.People.Where(person => person.Email == Email.Create("example@example.com");
我在控制台上收到以下警告。
The LINQ expression 'where ([person.Email] == __email_0)' could not be translated and will be evaluated locally.
我的 Person 表中只有几条记录,但是当它有更多记录时会影响性能吗?是否有解决方法。
解决方案
您期望 EF Core 将本地客户端代码(而不是表达式)转换为 SQL 代码,但它不会这样做,这就是它告诉您它将在本地评估的原因。
我建议实现一个值转换器,其中ConvertToProviderExpression
andConvertFromProviderExpression
表达式可以处理您在数据库中存储和读取的自定义逻辑。
推荐阅读
- html - 在AngularJS中单击按钮更改选定的值
- tensorflow - 来自自定义 keras 层的 tflite 转换器
- java - 如何使用 Spring Boot 以 InputStreamReader 作为其参数注入 BufferedReader?
- java - 如果元素可见执行操作并通过测试,否则仅通过测试
- python - 迭代列表并从模型中收集相应的字段值
- mysql - 在子查询中修改日期会减慢执行速度
- shopify - Shopify 液体:{% %} 和 {%- -%} 之间的区别
- prometheus-operator - 如何在 jsonnet 中进行嵌套 for 循环并访问变量?
- apache-spark - 获取 BusyPoolException com.datastax.spark.connector.writer.QueryExecutor ,我做错了什么?
- c# - 我的对象为空,但我仍然可以在其上调用函数(== null 返回 true)(getType 返回 myType)