gpt4 book ai didi

c# - 在 Linq 表达式中使用方法

转载 作者:行者123 更新时间:2023-11-30 23:22:56 25 4
gpt4 key购买 nike

我在 Web API 项目中使用 LINQ,该项目使用 Entity Framework 访问数据库。我使用脚手架创建了我的 API Controller

我们不希望 Web API 公开我们的 EF 模型类,因此我们改用 DTO。我修改了 Controller 方法以使用 DTO,并具有“翻译”方法,该方法在模型类和特定实体的 DTO 之间复制值,我在类中的多个方法中使用它。

对于这篇文章,我使用了一个简单的 Person 类,它具有三个属性:FirstName、LastName、MiddleName。

public IQueryable<PersonDto> GetPersons()
{
var personDtos = from p in db.Persons
order by p.LastName, p.FirstName
select new PersonDto()
{
FirstName = p.FirstName,
LastName = p.LastName,
MiddleName = p.MiddleName
};

return personDtos;
}

private PersonDto Translate(Person p)
{
if (person == null)
return null;

return new PersonDto()
{
FirstName = p.FirstName,
LastName = p.LastName,
MiddleName = p.MiddleName
}
}

如您所见,可以通过调用 LINQ 表达式中的 Translate 方法进行重构,如下所示:

public IQueryable<PersonDto> GetPersons()
{
var personDtos = from p in db.Persons
order by p.LastName, p.FirstName
select Translate(p);

return personDtos;
}

看起来不错,除了当我运行它时,我得到一个异常:

LINQ to Entities 无法识别“翻译”方法

有没有办法让它工作?我们的数据模型中的某些类具有相当多的属性,因此如果可能的话,最好在此处调用 Translate 方法。

最佳答案

这是因为 LINQ to Entities 必须将表达式转换为 SQL 查询,而您的方法无法转换,因为它不知道如何转换。一种方法是调用 AsEnumerable() 并在 LINQ to objects 上调用您的方法

var personDtos = from p in db.Persons.AsEnumerable()
order by p.LastName, p.FirstName
select Translate(p);

关于c# - 在 Linq 表达式中使用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38601036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com