我在工作中使用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的回复.
简短的版本应该已经可以工作了;基于错误:
类型: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)