当IN子句的值列表来自业务逻辑时,使用Dapper ORM使用IN子句编写查询的最佳方法是什么?例如,假设我有一个查询:
SELECT *
FROM SomeTable
WHERE id IN (commaSeparatedListOfIDs)
Run Code Online (Sandbox Code Playgroud)
它commaSeparatedListOfIDs是从业务逻辑传入的,它可以是任何类型的IEnumerable(of Integer).在这种情况下,我将如何构造查询?我是否必须做到目前为止我一直在做的事情,这基本上是字符串连接,还是有一些我不知道的高级参数映射技术?
对于stackoverflow.com 的Dapper Micro ORM的结果我印象非常深刻.我正在考虑我的新项目,但我有一个担心,有时我的项目需要有存储过程,我在网上搜索了很多但没有找到存储过程的任何东西.那么有没有办法让Dapper使用存储过程?
如果可能,请告诉我,否则我必须以我的方式延长它.
我对使用Dapper很感兴趣 - 但据我所知它只支持Query和Execute.我没有看到Dapper包含一种插入和更新对象的方法.
鉴于我们的项目(大多数项目?)需要进行插入和更新,在插入和更新的同时进行插入和更新的最佳做法是什么?
最好我们不必采用参数构建的ADO.NET方法等.
我现在能想出的最佳答案是使用LinqToSQL进行插入和更新.有更好的答案吗?
如何对数据库执行插入并使用Dapper返回插入的标识?
我尝试过这样的事情:
string sql = "DECLARE @ID int; " +
"INSERT INTO [MyTable] ([Stuff]) VALUES (@Stuff); " +
"SELECT @ID = SCOPE_IDENTITY()";
var id = connection.Query<int>(sql, new { Stuff = mystuff}).First();
Run Code Online (Sandbox Code Playgroud)
但它没有用.
@Marc Gravell谢谢你的回复.我已经尝试过你的解决方案但是,下面仍有相同的异常跟踪
System.InvalidCastException: Specified cast is not valid
at Dapper.SqlMapper.<QueryInternal>d__a`1.MoveNext() in (snip)\Dapper\SqlMapper.cs:line 610
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in (snip)\Dapper\SqlMapper.cs:line 538
at Dapper.SqlMapper.Query[T](IDbConnection cnn, String sql, Object param) in (snip)\Dapper\SqlMapper.cs:line 456
Run Code Online (Sandbox Code Playgroud) 我是Dapper Micro ORM的新手.到目前为止,我能够将它用于简单的ORM相关内容,但我无法使用类属性映射数据库列名.例如:
我有如下数据库表:
Table Name: Person
person_id int
first_name varchar(50)
last_name varchar(50)
Run Code Online (Sandbox Code Playgroud)
我有一个名为Person的课程
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,表中的列名与我尝试映射查询结果的数据的类的属性名不同.
var sql = @"select top 1 PersonId,FirstName,LastName from Person";
using (var conn = ConnectionFactory.GetConnection())
{
var person = conn.Query<Person>(sql).ToList();
return person;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,因为列名与对象的(Person)属性不匹配.在这种情况下,我可以在Dapper中手动映射(例如person_id => PersonId)具有对象属性的列名吗?
任何线索或帮助将受到高度赞赏.
我目前正在使用Entity Framework进行数据库访问,但想看看Dapper.我有这样的课程:
public class Course{
public string Title{get;set;}
public IList<Location> Locations {get;set;}
...
}
public class Location{
public string Name {get;set;}
...
}
Run Code Online (Sandbox Code Playgroud)
因此,可以在多个地点教授一门课程.实体框架为我执行映射,因此我的Course对象填充了一个位置列表.我如何与Dapper一起讨论这个问题,它是否可能,或者我必须在几个查询步骤中执行此操作?
我正在尝试使用dapper的Multimapping功能来返回ProductItems和相关Customers的列表.
[Table("Product")]
public class ProductItem
{
public decimal ProductID { get; set; }
public string ProductName { get; set; }
public string AccountOpened { get; set; }
public Customer Customer { get; set; }
}
public class Customer
{
public decimal CustomerId { get; set; }
public string CustomerName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的短小精悍的代码如下
var sql = @"select * from Product p
inner join Customer c on p.CustomerId = c.CustomerId
order by p.ProductName";
var data = con.Query<ProductItem, Customer, ProductItem>( …Run Code Online (Sandbox Code Playgroud) 我想在多个表上运行多个insert语句.我正在使用dapper.net.我没有看到任何方法来处理与dapper.net的交易.
请分享您对如何使用dapper.net进行交易的想法.
我有一个价值字典例如"姓名":"亚历克斯"
有没有办法将此传递给Dapper作为查询的参数?
这是一个显示我想要做的事情的例子.
IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
Run Code Online (Sandbox Code Playgroud) 我一直在玩这个,因为它看起来感觉很像记录的帖子/用户示例,但它略有不同,并不适合我.
假设以下简化设置(联系人有多个电话号码):
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望最终能够返回一个与多个Phone对象联系的东西.这样,如果我有2个联系人,每个联系人有2个电话,我的SQL将返回一个连接,作为结果集共4行.然后Dapper将弹出2个接触对象,每个接触对象有两部手机.
这是存储过程中的SQL:
SELECT *
FROM Contacts
LEFT …Run Code Online (Sandbox Code Playgroud)