我已经开始玩Dapper.Net了,到目前为止我真的非常喜欢它 - 但是,我遇到了一个问题.
假设我有一个POCO类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName { get { return FirstName + " " + LastName; } }
}
Run Code Online (Sandbox Code Playgroud)
现在,使用Dapper.Net和Dapper.Net扩展,我想通过这样做简单地从DB加载该数据类型的所有实例:
string connectionString = CloudConfigurationManager.GetSetting("DBConnection");
using (SqlConnection cn = new SqlConnection(connectionString))
{
cn.Open();
IEnumerable<Types.Person> entities = cn.GetList<Types.Person>();
var forceMe = entities.ToList();
}
Run Code Online (Sandbox Code Playgroud)
这在Linq设置中运行良好,但是当它使用强制评估的.ToList()命中行时,它会在FullName上以"无效列名"爆炸.考虑到它可能会尊重NotMapped的Entity Framework DataAnnotations内容,我尝试添加NotMapped属性(在向项目添加EF 5之后).这没用.
所以,问题是,如何告诉Dapper.Net数据库中没有预期的列?这是扩展的问题,试图为它在模型POCO中看到的所有内容映射数据库列吗?我是否需要恢复编写SQL,并明确询问我想要的列,或者是否有办法在列上获得等效的NotMapped?
提前致谢.
-亚当
为什么我会得到这个例外?代码不一样,但接近'demo'https://gist.github.com/1599013
例外:MissingMethodException
说明:
找不到方法:'System.Collections.Generic.IEnumerable
1<System.Object> Dapper.SqlMapper.Query(System.Data.IDbConnection, System.String, System.Object, System.Data.IDbTransaction, Boolean, System.Nullable1,System.Nullable`1)'.
码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using Dapper;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;
namespace daconsole2
{
class Program
{
class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public DateTime? LastPurchase { get; set; }
}
// container with all the tables
class MyDatabase : Database<MyDatabase>
{
public …Run Code Online (Sandbox Code Playgroud) 以下代码给出了无效的强制转换操作.我的MS Sql服务器中的Qty列是类型decimal(10,2)
#region SQL Syntax
var sql = "select qty from productarticle where articleid=@articleid and productid=@productid";
#endregion
using (IDbConnection cn = Connection)
{
cn.Open();
return cn.Query<double>(sql, new { articleid = articleid, productid = productid }).Single();
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试将其归还int,则没有问题.任何线索?
这是这个问题的后续行动:
由于参数化在Dapper的order by子句中不起作用,所以建议的方法是保留bobby表吗?Dapper是否提供了一些清理这些参数的方法,或者是否有推荐的正则表达式等.
我正在尝试从ac#class中的两个不同的vairables中删除两个表,但是我收到以下错误消息:
使用多映射API时,如果您具有Id参数名称以外的键,请确保设置splitOn参数:splitOn
通过SQL事件探查器捕获命令时,sql语句执行正常,所以我很难过.
精巧的代码是:
public void DeleteListCode(string listCodeId)
{
using (var block = new TransactionBlock())
{
// Get the code first
const string sql = "SELECT ListCode from ListCodes WHERE id =@listCodeId";
var code = TransactionBlock.Connection.Query<string>(sql, new {listCodeId}, TransactionBlock.Transaction)
.FirstOrDefault();
if (string.IsNullOrEmpty(code)) return;
const string sql2 = "delete from Lists WHERE ListCode = @code " +
"delete from ListCodes where Id = @listCodeId";
TransactionBlock.Connection.Query(sql2, new {listCodeId, code}, TransactionBlock.Transaction);
block.Commit();
}
}
Run Code Online (Sandbox Code Playgroud)
我已成功设法使用多选语句,但这在我使用两个自治参数的意义上略有不同.
我正在使用SQLite,Dapper和DapperExtensions,这些都是最新的NuGet.
这是我的表的架构......
CREATE TABLE `LibraryInfo` (
`Id` INTEGER NOT NULL,
`Name` TEXT NOT NULL CHECK(length ( Name ) > 0),
`Description` TEXT,
`Version` TEXT NOT NULL CHECK(length ( Version ) > 0),
PRIMARY KEY(Id)
);
Run Code Online (Sandbox Code Playgroud)
在其中我有一行包含以下数据
Id ="0"
Name ="Test Library"
Description ="这是测试库"
Version ="1.2.3.4"
这是我桌上的POCO ......
public class LibraryInfo
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public string Version { get; set; }
} …Run Code Online (Sandbox Code Playgroud) 当我DynamicParamters从模板对象创建时,我在努力使用Dapper将输出参数正确映射回对象。
var parameters = new DynamicParameters(entity);
parameters.Add("@Id", dbType: DbType.Int32, direction: ParameterDirection.Output);
parameters.Output(entity, x => x.Id);
await conn.ExecuteAsync(
"TodoItemInsert", entity,
commandType: CommandType.StoredProcedure);
Run Code Online (Sandbox Code Playgroud)
我希望上面的代码可以将生成的ID映射回我最初创建参数的实体中。无论我尝试什么,我都无法获取要从存储过程返回的参数。调用parameters.Get<int>("@Id")会引发KeyNotFoundException。 parameters.Get<int?>("@Id")返回null。
我的SQL是一个非常基本的插入程序
ALTER PROCEDURE [dbo].[TodoItemInsert]
@Name VARCHAR(255)
, @Description VARCHAR(512)
, @DueDate DATETIME = NULL
, @IsComplete BIT = 0
, @Id INT OUTPUT
AS
INSERT INTO
[TodoItems]
(
Name
, Description
, DueDate
, IsComplete
)
VALUES
(
@Name
, @Description
, @DueDate
, @IsComplete
)
SET @Id = SCOPE_IDENTITY() …Run Code Online (Sandbox Code Playgroud) 我一直很好奇Dapper(或许其他ORM)在与LINQ结合时如何处理对象检索.
如果我有这样的课程:
public static IEnumerable<SitePage> GetAll()
{
using (IDbConnection cn = new SqlConnection(g.Global.CONX))
{
cn.Open();
return cn.GetAll<SitePage>();
}
}
Run Code Online (Sandbox Code Playgroud)
我构建一个这样的查询:
var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId });
Run Code Online (Sandbox Code Playgroud)
我很好奇,如果在后台,整个记录集被拉入包括所有其他列(可能包含非常大的varchars),或者Dapper是否从这个查询中理解只是为了从sql db中提取我请求的列?我意识到它有点像新手,但我想更好地理解Dapper/LINQ交互.
这里发布了一个类似的问题:选择特定列 - 使用linq-what-gets-transferred,但我不确定是否已经完全回答.海报有2个问题,也没有使用我通常喜欢的lambda表达式.
对此的回答将使我的思绪发火(并且很可能改变我编码的方式,因为我一直谨慎并且觉得我通过显式sql编写了太多代码).
我试图学习如何使用await和async.
我有一个服务层,它有一个参考数据管理器.我的界面是:
public interface IReferenceDataService
{
Task<List<ReferenceItemDto>> GetAsync(ReferenceTypes type);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在UI中获取数据时,我这样做:
model.DeptPaymentTypes = _refDataService.GetAsync(Enums.ReferenceTypes.DeptPaymentTypes)
.Select(x => new SelectListItem {
Text = x.Description,
Value = x.Id.ToString() })
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误,"ToList不是Task <...的定义"
我的数据层调用使用Dapper QueryAsync获取数据...
public async Task<List<ReferenceItemDto>> GetAsync(Enums.ReferenceTypes type)
{
var table = string.Empty;
if(type == Enums.ReferenceTypes.DaysOfMonth)
{
var days = new List<ReferenceItemDto>();
for (int i = 1; i <= 31; i++)
{
days.Add(new ReferenceItemDto
{
Description = i.ToString(),
Id = i
});
}
return days;
}
switch (type)
{
case Enums.ReferenceTypes.SnowballTypes:
table …Run Code Online (Sandbox Code Playgroud) 我正在使用数据库制作一个简单的登录页面。因此,对于我的查询,我使用的是Dapper,但我坚持以下查询。
connection.Execute(@"SELECT count(Id) as Id FROM tblMedewerkers
where Naam = @Naam and Paswoord = @Paswoord",
new{
Naam = naam,
Paswoord = paswoord
});
Run Code Online (Sandbox Code Playgroud)
因此,如果“ count(Id)as Id”部分返回1,则登录正确。如果返回0,那就错了。
但是,如何从“ count(Id)as Id”中获取数据以进行处理呢?
dapper ×10
c# ×6
micro-orm ×2
sql ×2
.net-core ×1
async-await ×1
asynchronous ×1
linq ×1
parameters ×1
sql-order-by ×1
sql-server ×1
sqlite ×1