C# LinqToSQL-不支持到SQL的转换

C# LinqToSQL-不支持到SQL的转换,c#,linq-to-sql,.net-3.5,C#,Linq To Sql,.net 3.5,今天早上我一直在为LinqToSQL的一个问题而困惑。我将尝试用下面的缩略示例来总结,以解释我的观点 我有两张桌子: table Parent { ParentId } table Child { ChildId ParentId [FK] Name Age } 在我的项目中,这些类具有与LinqToSQL等价的类,但是,我编写了两个自定义模型类,希望我的UI使用它们,而不是使用LinqToSQL类 我从前端对数据的访问通过一个服务类,该服务类又调用一个存储库类

今天早上我一直在为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();
因此,在这一点上,我得到的方法没有支持的转换为sql错误时,我运行的一切作为c。我的自定义模型的父属性无法转换。[c.Parent属性是链接父模型类的对象引用。]

这一切都有道理,所以我的问题是:

你能提供查询过程吗 使用一些将转换为 将谓词表达式转换为正确的 要在数据库中运行的一段SQL 因此不会触发错误

到目前为止,我还没有和linq做过太多的工作,所以请原谅我的经验不足,如果我解释得不够好的话

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


非常感谢任何人的帮助。

首先,它回避了一个问题:为什么存储库返回UI类型?如果repo返回数据库类型,这就不是问题。考虑重构,以便RPO只处理数据模型,而UI在结尾(在任何组合之后)进行翻译。
如果您的意思是“并将其转换到数据库”,那么基本上不会。可组合查询只能使用LINQ到SQL模型中定义的类型和少数受支持的标准函数。最近在一个相关的问题上也出现了类似的情况

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

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


首先,它回避了一个问题:为什么存储库返回UI类型?如果repo返回数据库类型,这就不是问题。考虑重构,以便RPO只处理数据模型,而UI在结尾(在任何组合之后)进行翻译。
如果您的意思是“并将其转换到数据库”,那么基本上不会。可组合查询只能使用LINQ到SQL模型中定义的类型和少数受支持的标准函数。最近在一个相关的问题上也出现了类似的情况

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

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

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