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

Gil*_*rts 6 c# linq dapper

我在工作中使用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();
Run Code Online (Sandbox Code Playgroud)

cagedAnimal包含带有getter和setter的公共属性AnimalId和AnimalType.

但是在执行此代码时,我收到以下错误:

类型:dapper不支持SMDApp.Models.Animal

以下代码确实有效:

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

对我来说,使用现有对象会更方便,特别是在我使用对象的多个属性作为查询参数的情况下.任何人都可以告诉我为什么这适用于匿名对象而不是自动生成的LINQ对象?

编辑回应本罗宾逊的回复.

第二次编辑回应Marc Gravell的回复.

Mar*_*ell 4

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

类型:SMDApp.Models.CgedAnimal 不受 dapper 支持

我的结论是,要么你实际上正在传递new {cagedAnimal}而不是cagedAnimal要么CagedAnimal有一个属性(Parent也许?)它本身就是 a CagedAnimal,而哪个短小精悍的人无法理解。当前的行为是为所提供的参数对象的每个公共属性添加一个参数- 如果它无法弄清楚如何将任何属性发送到数据库,它会抱怨。您应该发现仅包含值成员的简单 POCO 可以正常工作。

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

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

 new { obj.Foo, obj.Bar, id, key = "something else" }
Run Code Online (Sandbox Code Playgroud)

  • @Giles ...你可以尝试最新的吗,我认为它现在应该按预期工作 (2认同)