gpt4 book ai didi

c# - 在 Where Linq 语句中使用具有泛型类型的 == 运算符

转载 作者:太空狗 更新时间:2023-10-29 22:59:10 26 4
gpt4 key购买 nike

我正在尝试使用 SQLinq library 生成 SQL 查询(作为字符串) .代码上下文是一个通用类,它创建带有 Where 子句的查询。

public string Get<TEntity, TId>(TId id)
where TEntity: IHasAnIdField<TId>
{
var query = new SQLinq<TEntity>();

// The following statement does not compile due to error in lambda with "==" operator
// "Operator '==' cannot be applied to operands of type 'TId' and 'TId'"
query = query.Where((Expression<Func<TEntity, bool>>)(i => i.Id == id));

var sql = query.ToSQL().ToQuery();
return sql;
}

添加一个 where TId: class 泛型约束解决了问题,但由于我的 TId 在大多数情况下都是值类型(主要是 intlong , Guid) 它不符合我的需求。并且通用约束 where TId: struct 不会使其编译。我了解发生这种情况的原因(感谢 this thread )。

实体的接口(interface)是

public interface IHasAnIdField<TId>
{
TId Id { get; }
}

我不能使用 .Equal(..) 调用或任何 EqualityComparer,因为 SQLinq 工具不处理表达式树中的方法调用。

如何通知编译器我的 TId 与 == 运算符兼容?

最佳答案

您可以手动构建表达式:

public string Get<TEntity, TId>(TId id)
where TEntity: IHasAnIdField<TId>
{
var query = new SQLinq<TEntity>();

// predicate: i => i.Id == id
var arg = Expression.Parameter(typeof(TEntity), "i");
var predicate =
Expression.Lambda<Func<TEntity, bool>>(
Expression.Equal(
Expression.Property(arg, "Id"),
Expression.Constant(id))
arg);


query = query.Where(predicate);
var sql = query.ToSQL().ToQuery();
return sql;
}

关于c# - 在 Where Linq 语句中使用具有泛型类型的 == 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22562008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com