gpt4 book ai didi

c# - 使用 LINQ 自动生成类型的 Dapper 参数化查询

转载 作者:太空狗 更新时间:2023-10-29 21:30:10 27 4
gpt4 key购买 nike

我在工作中结合使用了 LINQ 和 Dapper。出于性能原因,我在某些地方用 Dapper 替换了我的 LINQ 代码。我有很多通过从 SQL Server 拖放到 Visual Studio 数据库图表中创建的 LINQ 数据对象。

在下面的例子中,我已经在内存中有一个 LINQ 对象,我想将它作为查询的参数传递给 Dapper。例如:

Animal animal = con.Query<Animal>(" select * " +
" from animal " +
" where animalid = @AnimalId " +
" and animaltype = @AnimalType ",
cagedAnimal).SingleOrDefault();

cagedAnimal 包含带有 getter 和 setter 的公共(public)属性 AnimalId 和 AnimalType。

但是在执行这段代码时我得到了以下错误:

The type : SMDApp.Models.Animal is not supported by dapper

下面的代码确实有效:

Animal animal = con.Query<Animal>(" select * " +
" from animal " +
" where animalid = @AnimalId " +
" and animaltype = @AnimalType ",
new
{
AnimalId = cagedAnimal.AnimalId,
AnimalType = cagedAnimal.AnimalType
}
).SingleOrDefault();

使用现有对象对我来说会更方便,尤其是在我使用对象的多个属性作为查询参数的情况下。谁能告诉我为什么这适用于匿名对象而不适用于自动生成的 LINQ 对象?

根据 Ben Robinson 的回复进行编辑。

第二次编辑以回应 Marc Gravell 的回复。

最佳答案

简短的版本是应该已经可以工作了;基于错误:

The type : SMDApp.Models.CagedAnimal is not supported by dapper

我得出结论,要么您实际上传递的是 new {cagedAnimal} 而不是 cagedAnimal或者,您的 CagedAnimal 有一个属性(Parent,也许?)它本身就是一个 CagedAnimal,而 dapper 无法理解。当前的行为是为提供的参数对象的每个公共(public)属性 添加一个参数 - 如果它无法弄清楚如何将任何属性发送到数据库,它提示道。您应该会发现只有值成员的简单 POCO 工作正常。

但是!请注意,它不会尝试解析您的 SQL - 特别是,它不会检查提供的查询中的参数。因此,使用 POCO 方法意味着您要向查询添加不必要的属性。

我们广泛使用 dapper,我们只是使用方法:

 new { obj.Foo, obj.Bar, id, key = "something else" }

关于c# - 使用 LINQ 自动生成类型的 Dapper 参数化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6520128/

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