今天早上我一直在用LinqToSQL解决一个问题。我将尝试用下面的缩写示例进行总结来解释我的观点。
我有DB两个表:
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.Parent属性无法转换。 [c.Parent属性是对链接的父模型类的对象引用。]
这一切都有道理,所以我的问题是:
您能提供查询过程吗? 有一些规则将转换 谓词表达成正确 要在数据库中运行的SQL 因此不会触发错误?
到目前为止,我还没有对linq做过多少工作,所以请原谅我缺乏经验,如果我没有充分解释这一点。
另外,对于那些评论我选择的架构的人,我已经改变它来解决这个问题,我只是在这个阶段玩弄想法。我想知道是否有答案供将来参考。
非常感谢有人可以提供帮助。
答案 0 :(得分:1)
首先,它提出了一个问题:为什么存储库会返回UI类型?如果repo返回了数据库类型,那么这不是问题。考虑重构,以便repo只处理数据模型,并且UI在结尾处完成翻译(在任何合成之后)。
如果你的意思是“并将其翻译成数据库” - 那么基本上没有。可组合查询只能使用LINQ-to-SQL模型中定义的类型以及一些受支持的标准函数。最近在相关问题see here上出现了类似的东西。
对于某些场景(异常逻辑,但使用LINQ-to-SQL模型中定义的类型),您可以在数据库中使用UDF,并自己编写逻辑(在TSQL中) - 但只能使用LINQ-to- SQL(不是EF)。
如果音量不高,可以使用LINQ-to-Objects作为最后一位。只需在受影响的.AsEnumerable()
之前添加Where
- 这将在托管的.NET代码中执行此逻辑(但谓词不会在数据库查询中使用):
return _repository.GetAllChildren().AsEnumerable()
.Where(c => c.Parent.ParentId == parentId).ToList();