【发布时间】:2011-09-25 02:17:41
【问题描述】:
我在工作中结合使用 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 的公共属性 AnimalId 和 AnimalType。
但是在执行此代码时出现以下错误:
类型:SMDApp.Models.Animal 是 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 的回复进行了第二次编辑。
【问题讨论】:
-
你确定你在做
"...", cagedAnimal)吗?你可能在做"...", new { cagedAnimal })吗?基本上 - 这应该已经工作了,虽然它有点浪费,因为可能会不必要地添加额外的参数/ -
只是为了让您知道我刚刚发布了一个修复程序 斗争。我还没有部署到 nuget,但是使用新代码,您上面的示例应该可以正常工作