【问题标题】:LinqToSQL - no supported translation to SQLLinqToSQL - 不支持 SQL 转换
【发布时间】:2010-10-04 16:20:36
【问题描述】:

今天早上我一直在为 LinqToSQL 的一个问题感到困惑。我将尝试用下面的简短示例进行总结,以解释我的观点。

我有两个数据库表:

table Parent
{
   ParentId
}

table Child
{
   ChildId
   ParentId [FK]
   Name
   Age
}

这些在我的项目中有 LinqToSQL 等效类,但是,我编写了两个我希望我的 UI 使用的自定义模型类,而不是使用 LinqToSQL 类。

我从前端的数据访问通过一个服务类,该服务类又调用一个存储库类,该存储库类通过 linq 查询数据。

在存储库级别,我通过以下方式返回 IQueryable:

return from data in _data.Children
       select new CustomModel.Child
       {
          ChildId = data.ChildId,
          ParentId = date.ParentId
       };

然后,我的服务层会在返回该父级的子级列表之前添加父级的附加查询限制。

return _repository.GetAllChildren().Where(c => c.Parent.ParentId == parentId).ToList();

所以此时,当我运行所有内容时,由于无法转换自定义模型的 c.Parent 属性,我得到该方法没有支持的 sql 转换错误。 [c.Parent 属性是对链接的父模型类的对象引用。]

这一切都说得通,所以我的问题是:

能否提供查询过程 有一些规则可以转换 谓词表达式成正确的 在数据库中运行的一段 SQL 因此不会触发错误?

到目前为止,我还没有对 linq 做过很多工作,如果我没有充分解释这一点,请原谅我缺乏经验。

另外,对于那些评论我选择的架构的人,我已经对其进行了更改以解决这个问题,我在这个阶段只是在玩弄一些想法。我想知道是否有答案以供将来参考。

如果有人能提供帮助,非常感谢。

【问题讨论】:

    标签: c# linq-to-sql .net-3.5


    【解决方案1】:

    首先,它引出了一个问题:为什么存储库会返回 UI 类型?如果 repo 返回数据库类型,这将不是问题。考虑重构,以便 repo 只处理数据模型,而 UI 在最后(在任何组合之后)进行翻译。


    如果您的意思是“并将其转换为数据库” - 那么基本上,不。可组合查询只能使用在 LINQ-to-SQL 模型中定义的类型,以及少数受支持的标准函数。最近在一个相关问题see here 上出现了类似的情况。

    对于某些场景(不寻常的逻辑,但使用 LINQ-to-SQL 模型中定义的类型),您可以在数据库中使用 UDF,并自己编写逻辑(在 TSQL 中) - 但只能使用 LINQ-to- SQL(不是 EF)。

    如果音量不高,您可以在最后一位使用 LINQ-to-Objects。只需在受影响的 Where 之前添加一个 .AsEnumerable() - 这将在托管 .NET 代码中执行这一点逻辑(但谓词不会在数据库查询中使用):

    return _repository.GetAllChildren().AsEnumerable()
                .Where(c => c.Parent.ParentId == parentId).ToList();
    

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      相关资源
      最近更新 更多