【问题标题】:Method X has no supported translation to SQL - booleans and datetime方法 X 不支持对 SQL 的转换 - 布尔值和日期时间
【发布时间】:2011-11-03 21:51:59
【问题描述】:

有没有人建议如何使 LINQ to SQL 支持此功能?

public bool IsEnabled()
{
    return !this.Disabled && 
           ((!this.EnabledFrom.HasValue || this.EnabledFrom < DateTime.Now) && 
            (!this.EnabledTo.HasValue || this.EnabledTo > DateTime.Now));
}

Disabled 是 bool,EnabledFrom 和 EnabledTo 是 DateTime?以及所有数据库字段。

【问题讨论】:

  • 您显示的代码中似乎没有任何 LINQ。我怀疑这是导致您的错误的代码。
  • 使用 IsEnabled 的查询示例(部分); query = query.Where(a => a.PageMeta.Hidden == !visible && a.PageMeta.IsEnabled() == visible);
  • 问题可能是它试图在 SQL 中查找 IsEnabled。将逻辑从 IsEnabled 直接移动到 linq 查询。
  • Linq2Sql应该把你的代码转换成什么SQL语句?什么是 PageMeta?你的 IsEnabled 方法中的“this”指的是什么?
  • 让它返回一个表达式。

标签: c# linq-to-sql


【解决方案1】:

让您的 IsEnabled 方法返回一个表达式。

请看这里:http://www.atrevido.net/blog/2007/09/05/Calling+Custom+Methods+In+LINQtoSQL.aspx

如下所示(未经测试):

static Expression<Func<Account, bool>> IsEnabled = a =>
    !a.Disabled && 
    ((!a.EnabledFrom.HasValue || a.EnabledFrom < DateTime.Now) && 
     (!a.EnabledTo.HasValue || a.EnabledTo > DateTime.Now));

【讨论】:

  • 看起来很棒!但是您知道我如何通过 EntityRef 访问 IsEnabled:.Where(a => a.Account.IsEnabled)
  • .Where 将在查询中的对象上执行,但“Account”是对象上的 EntityRef。这将起作用:query.Select(a => a.Account).Where(IsEnabled) - 但是我只得到 Accounts 作为回报,我需要原始对象
  • 然后将 IsEnabled 更改为不使用 Account 而是使用 a 的类型。
  • a 可以是具有 Account 作为 EntityRef 的不同类型的对象。所以我想要一个动态的解决方案..我并不容易;)
  • 嗯,也许让 IsEnabled 成为一个通用函数?否则我就没主意了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多