该成员不支持转换为 SQL。尝试在 LINQ to SQL 语句中访问我的 Partial 类中的属性时。Lambda 表达式?

sol*_*man 5 .net c# lambda inheritance linq-to-sql

我的数据库中有 3 个表

  • 国家
  • 城市
  • 房子

国家表看起来像

 CountryID
 Name    
Run Code Online (Sandbox Code Playgroud)

城市表看起来像

 CountryID
 CityID
 Name
Run Code Online (Sandbox Code Playgroud)

房子

 CountryID
 CityID
 HouseID
 Name
Run Code Online (Sandbox Code Playgroud)

我使用 LINQ to SQL,上面的表成为类并拥有它们的属性等。

现在我有自己的抽象类

地点

并为继承 Location 抽象类的 Country、City、House 创建了部分类

因此可以具有像 FindByID() 这样的通用功能和像 .Parent(位置类型)这样的属性

现在让我们取 .Parent ,它基本上返回每个班级的 Parent

所以

房子会回来

 .Parent  //as City
Run Code Online (Sandbox Code Playgroud)

城市将回归

 .Parent  //as Country
Run Code Online (Sandbox Code Playgroud)

国家会回来

 .Parent  //as Country
Run Code Online (Sandbox Code Playgroud)

现在尝试使用时

City.Parent 在 LINQ to SQL 语句中我得到一个

 The member 'Location`1[City].Parent' has no supported translation to SQL.
Run Code Online (Sandbox Code Playgroud)

现在人们一直在提到如何使用 Lambda 表达式来解决这个问题。有人可以给我一个关于这种情况的好例子吗

.Parent 应该是什么样子

 Location Parent
 {
    get
   {
        //Please fill Lambda expression here
   }
 }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 2

您的.Parent属性在 LINQ-to-Objects 中会很好,但正如消息所述,如果需要创建 TSQL,它将不知道如何处理它。它无法通读您的 C# 代码(当时为 IL)来推断含义。充其量,您可能可以对返回某种形式的某个函数做一些事情Expression,但使用起来并不有趣。

基本上,当与 ORM 交互时,您只能谈论它已经知道的事情。您可以UDF 映射到数据上下文并使用它,但同样 - 不太好。

要使用Expression,您需要使用Expression.Invoke和 自滚动 lambda(当将它们组合起来做有趣的事情时,例如将它们与预期值进行比较);这真的不会很好。我可能可以一起举一个例子,但坦率地说,我认为你的 DAL/存储库不应该使用这些额外的属性,而应该限制自己使用 ORM 属性。即使有点违反DRY。