- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不完全理解为什么 select 中的嵌套调用在 LinqKit 中不起作用,想知道是否有人能够帮助我理解。
我的问题:
首先让我列出有效的方法。
假设我们有三个数据库对象:
public class Customer {
public int Id {get; set;}
public string Name {get; set;}
public ICollection<Address> Addresses {get;set;}
}
public class Address {
public int Id {get;set;}
public string AddressLine {get;set;}
public int? Customer_Id { get; set; }
[ForeignKey("Customer_Id")]
public virtual Customer Customer {get; set;}
public int? Coordinates_Id { get; set; }
[ForeignKey("Coordinates_Id")]
public virtual Coordinates Coordinates {get; set;}
}
public class Coordinates {
public int Id {get;set;}
public double Latitude {get;set;}
public double Longitude {get;set;}
}
我有三个模型
public class CustomerModel {
public int Id {get; set;}
public string Name {get;set;}
public AddressModel Address {get;set;}
}
public class AddressModel{
public int Id {get;set;}
public string AddressLine {get;set;}
public CoordinatesModel Coordinates {get;set;}
}
public class CoordinatesModel {
public int Id {get;set;}
public double Latitude {get;set;}
public double Longitude {get;set;}
}
所以,现在我想创建可重用的选择表达式。所以我创造了这些
public static Expression<Func<Address, AddressModel>> ToAddressModel = address =>
new AddressModel {
Id = address.Id,
AddressLine = address.AddressLine,
Coordinates = new Coordinates {
Id = address.Coordinates.Id,
Latitude = address.Coordinates.Latitude,
Longitude = address.Coordinates.Longitude
}
};
public static Expression<Func<Customer, CustomerModel>> ToCustomerModel = customer =>
new CustomerModel {
Id = customer.Id,
Name = customer.Name
Address = customer.Addresses.AsQueryable().Select(ToAddressModel).ToList()
};
最后,如果我去查询这个,我会写
dbContext.Customers
.AsExpandable()
.Select(ToCustomerModel)
.ToList();
这按预期工作。但我现在想使 CoordinatesModel 更具可重用性,并制作一个 Expression 来映射它并在 AddressModels Expression 中调用它。
public static Expression<Func<Coordinates, CoordinatesModel>> ToCoordinates = coordinates =>
new Coordinates {
Id = coordinates.Id,
Latitude = coordinates.Latitude,
Longitude = coordinates.Longitude
}
public static Expression<Func<Address, AddressModel>> ToAddressModel = address =>
new AddressModel {
Id = address.Id,
AddressLine = address.AddressLine,
Coordinates = ToCoordinatesModel.Invoke(address.Coordinates)
};
现在如果我查询
dbContext.Customers
.AsExpandable()
.Select(ToCustomerModel)
.ToList();
它抛出
System.NotSupportedException: LINQ to Entities does not recognize the method 'CoordinatesModel Invoke[Coordinates,Model](System.Linq.Expressions.Expression`1[System.Func`2[Coordinates,CoordinatesModel]], Coordinates)' method
如果这不正确也没关系,我只是想了解为什么这是不正确的。如果我不针对集合调用(如不确定的导航属性),则嵌套调用没问题。
最佳答案
您必须明确告诉 linq 您正在扩展子表达式 - 就像您在表上使用 .AsExpandable()
时一样 - 在子集中调用时,您必须扩展父级以遍历树并展开子表达式。
所以....您需要做的就是向父表达式添加一个Expand
,在这种情况下
public static Expression<Func<Customer, CustomerModel>> ToCustomerModel = customer =>
new CustomerModel {
Id = customer.Id,
Name = customer.Name
Address = customer.Addresses.AsQueryable().Select(ToAddressModel.Expand()).ToList()
};
导航属性很好,因为当你展开它的父级时,它会拉入所有子表达式以展开表达式 - 但选择(我只能假设是另一个投影)除非明确声明。
关于c# - LinqKit 嵌套调用 "LINQ to Entities does not recognize the method ' Invoke'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62227180/
我正在使用 LinqKit允许动态组合表达式的库。 对于编写 Entity Framewok 数据访问层来说,这是一种纯粹的幸福,因为可以选择性地重用和组合多个表达式,从而实现代码的可读性和高效性。
我有 2 个类: public class Employee { public int Id {get;set;} public string Name {get;set;} } pu
我开始使用 LinqKit的 PredicateBuilder使用 Linq 表达式无法实现的 OR 条件创建谓词。 我面临的问题是,如果我以 PredicateBuilder.True() 开头它返
我一直在使用LinqKit创建通用查询相当长一段时间。 一直困扰我的一件事是,您总是必须测试过滤器中发送的值是否有效。 例如:假设我有一个字符串过滤器。条件可以是 Equal、StartsWith、E
我一直在使用LinqKit创建通用查询相当长一段时间。 一直困扰我的一件事是,您总是必须测试过滤器中发送的值是否有效。 例如:假设我有一个字符串过滤器。条件可以是 Equal、StartsWith、E
我正在为我的应用程序执行搜索。搜索有效,除非用户的搜索通过搜索相关实体进行级联。我调试了代码并测试了 Entity Framework 生成的 SQL。我发现问题是 Contains() 在 SQL
给定一个简单的父/子类结构。我想使用 linqkit 在父项上应用子 lambda 表达式。我还希望通过实用方法提供 Lambda 表达式。 public class Foo { public
我正在尝试使用 LinqKit AsExpandable在我的 EfCore2.0项目,我遇到了这个问题,其中 Includes不起作用。 在尝试调试时,我下载了 LinqKit来自 github 的
我一直在尝试合并 LINQKit然而,我在共享数据访问层中遇到了障碍。使用 ExpandableQuery 构造嵌套查询时,表达式解析器无法正确解包 ExpandableQuery 并构造有效的 SQ
如何从 LinqKit.ExpandableQuery 返回 SQL ? 我正在使用 stevefenton.co.uk 中的代码但它似乎失败了 private static System.Data.
这是我想做的: class MyDbContext : DbContext { private static Expression> myExpression1 = x => /* somet
我在尝试执行使用 PredicateBuilder 动态构建的查询时遇到问题。 我能够构建查询,但是在执行查询本身时,我得到以下“TypeLoadException”... 运行时: return c
在 Entity Framework Core 中使用谓词生成器时,我收到以下错误。 The source IQueryable doesn't implement IAsyncEnumerable.
我想使用 LinqKit 的 PredicateBuilder 并将谓词传递给相关模型的 .Any 方法。 所以我想建立一个谓词: var castCondition = PredicateBuild
我正在使用 LinqKit PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx) 作为执行搜索的方法。这就
我正在使用 LinqKit,我想编写一个谓词,其中代码必须调用一个普通的 bool 方法,如下所示: var predicate = PredicateBuilder.False(); var pre
我正在使用 EntityFramework 和 LinqKit构建被翻译成 SQL 的表达式树。我们还使用规范模式来组织我们的查询。 几乎所有领域对象都需要通过描述执行查询,但在某些类中,属性称为“名
我正在使用 LinqKit (http://www.albahari.com/nutshell/linqkit.aspx) 有没有一种方法可以让下面的代码在不定义具体类的情况下工作? 尝试使用 LIN
我正在尝试动态构造一个类似于下面的表达式,我可以在其中使用相同的比较函数,但可以传入被比较的值,因为该值是从属性“higher-up”传递的' 在查询中。 var people = People
我不完全理解为什么 select 中的嵌套调用在 LinqKit 中不起作用,想知道是否有人能够帮助我理解。 我的问题: 首先让我列出有效的方法。 假设我们有三个数据库对象: public class
我是一名优秀的程序员,十分优秀!