C# LinqToSQL-不支持到SQL的转换
今天早上我一直在为LinqToSQL的一个问题而困惑。我将尝试用下面的缩略示例来总结,以解释我的观点 我有两张桌子: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类 我从前端对数据的访问通过一个服务类,该服务类又调用一个存储库类
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();