出于演示目的,我正在制作一个插入函数,我想返回传入类型的变量。
我是初始查询的用户 Dapper.fsharp,然后我想运行原始 SQL 查询来获取最后插入的值。
所以我有这样的东西用于演示目的
let Insert<'a> asyncQuery =
asyncQuery
|> connection.InsertAsync<'a>
|> RunSynchronously
|> ignore
(*This is a Dapper.fsharp query. Running this returns the number of rows inserted (int) *)
let table = asyncQuery.Table (*This is a string*)
let result =
connection.Query<'a>($"""Select * From {table} Where id = (select last_insert_id())""") (*Should return an IENumerable of type 'a*)
|> EnumerableToArray
result |> first
Run Code Online (Sandbox Code Playgroud)
然后这就是所谓的
let newSession =
insert {
table "sessions"
value newSession
} |> Insert
Run Code Online (Sandbox Code Playgroud)
其中 newSession 是会话类型 …
我有一个当前的工作解决方案,正在为列表中的每个项目 Id 执行新的数据库调用,并且我正在尝试执行单个调用,而不是从多个项目返回数据。
为此,我尝试将项目 ID 列表传递到访问 MySQL 数据库的 Dapper 查询中。我要么收到操作数应包含 1 列的错误,要么收到第一个结果,而不是数据库中每个 projectId 的结果。我当前使用的 c# 代码是
public List<ProjectPortalManager> GetPPTech(IEnumerable<int> projIds)
{
string sql = @"SELECT tProject.ProjectID,
tProject.ProjectName,
tProject.PMUserID,
if(cast(tproject.dateinit as char) = '0000-00-00 00:00:00',null,tproject.dateinit) as DateInit,
tproject.comments,
tproject.ProjectNumber,
c.LName,
c.FName,
c.orgid,
c.orgname as organization,
c.Email,
c.Phone
From tProject left Join tContacts c on tProject.PMUserID = c.UserId
Where tProject.ProjectID in (@ProjIds);";
try
{
List<ProjectManager> pms = Conn.Query<ProjectManager>(sql, new { ProjIds = new[] { projIds } }).ToList();
return pms;
}
catch (Exception …Run Code Online (Sandbox Code Playgroud) 我有这个:
public class object_a
{
public int ta_Id { get; set; }
public string ta_Label { get; set; }
public IEnumerable<table_c> SomeName { get; set; }
}
public class table_b
{
public int Id {get;set;}
public int SomeId {get;set;}
public int FK_A {get;set;}
}
public class table_c
{
public int Id {get;set;}
public int Max {get;set;}
public string Label {get;set;}
public int FK_A {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
使用Dapper我检索object_a包含任意数量子对象的列表table_c
using (System.Data.SqlClient.SqlConnection sqlConnection = new System.Data.SqlClient.SqlConnection(_con))
{
sqlConnection.Open();
var sql = …Run Code Online (Sandbox Code Playgroud) 我们正考虑从EF切换到Dapper.我想使用Dapper Extensions填充我的实体,如:
UserInstance = conn.Get(UserProfile)(RecordID)
Run Code Online (Sandbox Code Playgroud)
我们所有的主键列都命名为RecordID,但前面是Parent_RecordID.Get尝试使用Parent_RecordID作为我的主键列,"如果多个属性以Id结尾,Dapper Extensions将使用第一个Id属性作为主键."
我该如何更改它,以便它将RecordID作为我的主键仅查找每个表?我知道我可以为实体创建自己的映射器,但我希望这个更改适用于每个表(其中有100个),而不是为每个表创建一个映射器.
我原本以为dapper-dot-net可以在这样的查询中替换表名:
connection.Query("SELECT * FROM @Table WHERE [Id] = @Id", new {Table = tb, Id = id});
Run Code Online (Sandbox Code Playgroud)
但是,它似乎不会取代表名.这是预期的限制吗?
我有一个存储过程总是返回一个字符串列表.但是,根据传递给存储过程的参数,字符串列表的列标题将更改.Dapper能够处理这个吗?如果是这样,应该如何处理?
conn.Open();
var p = new DynamicParameters();
p.Add("Search_Function_CD", searchFunction, DbType.String, ParameterDirection.Input);
p.Add("Search_Value", searchValue, DbType.String, direction: ParameterDirection.Input);
p.Add("o_resultset", dbType: DbType.Object, direction: ParameterDirection.Output);
var Results = (IDictionary<string, object>)conn.Query(sql: CommonConstants.ProcedureConstants.PKG_GET_SEARCH_RESULTS, param: p, commandType: CommandType.StoredProcedure);
foreach (object o in Results)
{
string element = Results.Values.ElementAt(1) as string;
searchResults.Add(element);
}
conn.Close();
return searchResults;
Run Code Online (Sandbox Code Playgroud) 我们将Dapper用作旧版Informix数据库的ORM,并且在该数据库中,布尔字段实际上存储为Char,其中“ F”表示False,“ T”表示True。
在我们的POCO中,我们希望公开一个布尔值属性,并指示Dapper在读写数据库时映射到相关char值/从相关char值映射。
例如:
假设我们在名为“活动”的表中有一个字段。数据库中“活动”列的值将是“ F”的“ T”
我们的POCO可能如下所示:
public class MyTable
{
public bool Active { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是否可以在Dapper中创建一个自定义映射,对于该列,如果基础值是“ T”,则该列将POCO中的Active属性设置为true;如果是“ F”,则将false设置为false?
我知道可以解决此问题的一种方法是拥有两个属性,一个是Dapper可以直接映射到的字符串,另一个是POCO的使用者使用的布尔值。即:
public class MyTable
{
public string Active { get; set; }
public bool MyActive
{
get { return Active == "T"; }
set { Active = (value == "T"); }
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是必须维护两个属性,所以如果有一种方法可以扩展dapper来为我完成此操作,那将是一个很好的选择(特别是因为数据库表中有很多类似这样的字段) 。
我已经看过实现自定义类型映射的方法,但是尽管这对自定义复杂类型有效,但是我不确定当我想从一种基本类型映射到另一种基本类型时,它如何在这种情况下工作。
我真的很沮丧地搜索这个答案,哪个更好 - 传统的System.Data.SqlClient方法或使用任何ORM,如EF或Dapper我通过许多链接看到了很多比较,有些是:
我能理解的一件事是,手写的传统sql代码在性能上优于任何其他方法.但是我仍然想到,如果我们已经拥有最好的方法,那么ORM为什么呢?
是否只是因为我们想减少DataLayer代码?或者我们不想管理我们的数据库,并希望在我们的c#代码中编写所有内容(代码/数据优先)
为什么EF被引入,如果只有代码管理是问题那么,为什么以及我们如何妥协查询执行的性能和速度,甚至ORM都有限制.
请回答我的问题,如果需要任何编辑,请告诉我.
我唯一担心的是网站的速度和性能.
提前致谢.
我通过以下方式通过第三方(例如Google)登录用户:
var info = await _signInManager.GetExternalLoginInfoAsync();
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, false);
Run Code Online (Sandbox Code Playgroud)
上面的内容由于存在而应该成功,如何捕获登录用户的userId?userId是位于我的数据库中Users表上的userId,它不会来自第三方登录提供程序。
这可能吗?我现在似乎找不到任何可以让我检索它的函数或对象。我以为可能是从User Object中获取的,但是据我的理解,它来自HttpContext,在此时,该用户将不会具有已登录的用户身份,至少直到刷新页面后才如此。我也想避免仅出于此目的重定向到另一个页面。
注意:我正在使用Dapper,并且在我的项目中没有EF的痕迹。不知道这有多重要。
我有一个SQL Server存储过程:
exec GetBob @id=3
Run Code Online (Sandbox Code Playgroud)
但是当我在函数中调用此存储过程时,我收到错误:
过程或函数需要@id参数
但是@id正确的参数(获取值).
public List<Bob> GetBob(int id)
{
try
{
connection();
con.Open();
DynamicParameters param = new DynamicParameters();
param.Add("@id", id);
IList<Bob> EmpList = SqlMapper.Query<Bob>(con, "GetBob", param).ToList();
con.Close();
return EmpList.ToList();
}
catch (Exception)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)