gpt4 book ai didi

c# - 自定义属性和 lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 19:28:38 27 4
gpt4 key购买 nike

我已将自定义属性添加到 LINQ-to-SQL 实体:

public partial class User
{
public bool IsActive
{
get
{
// note that startDate and endDate are columns of User table
return startDate <= DateTime.Now && endDate >= DateTime.Now;
}
}
}

现在我需要将此属性与 lambda 表达式一起使用:

activeUsers = users.Where(u => u.IsActive);

但是当执行此代码时,我得到一个 System.NotSupportedException。异常消息表示 “不支持成员 'User.IsActive' 的 SQL 转换”

有没有办法解决这个问题?

最佳答案

IsActive您显示的是常规 C# - 它将被编译为 IL,并且不可用于 LINQ-to-SQL(等)检查并转换为 TSQL 以在数据库中执行。这里的一个选项可能是:

public static Expression<Func<User,bool>> GetIsActiveFilter() {
return user => user.StartDate <= DateTime.Now &&
user.EndDate >= DateTime.Now;
}

那么你应该可以使用:

activeUsers = users.Where(User.GetIsActiveFilter());

或者类似的——也许是一种扩展方法:

public static IQueryable<User> ActiveOnly(this IQueryable<User> users) {
return users.Where(user => user.StartDate <= DateTime.Now &&
user.EndDate >= DateTime.Now);
}

然后:

activeUsers = users.ActiveOnly();

这里的区别在于我们使用的是 IQueryable<T>接口(interface)和表达式树,这让 LINQ 能够理解我们的意图,并创建合适的 TSQL 来实现同样的目的。

关于c# - 自定义属性和 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726285/

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