我有这堂课......
public class MyDTO
{
public int Id { get; set; }
public bool Selected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后使用dapper尝试创建这样的列表......
var list = this.db.OpenConnection().Query<MyDTO>(
@"SELECT T1.id, T2.id IS NOT NULL AS selected
FROM table1 T1
LEFT
JOIN table2 T2
ON T2.id = T1.id
AND Tl.id = @Id",
new { Id = id });
Run Code Online (Sandbox Code Playgroud)
返回像这样的结果集....
id selected
9 0
10 1
11 1
12 0
Run Code Online (Sandbox Code Playgroud)
但是当执行上面的代码时,我收到一个错误
[InvalidCastException: Specified cast is not valid.]
Deserialize3d3c9260-abcb-4964-97c1-4a4e66b786d3(IDataReader ) +354
[DataException: Error parsing column 2 …
Run Code Online (Sandbox Code Playgroud) 我无法理解这是如何可能的.请帮忙!!
我有一个带有trayicon的应用程序.我希望在用户双击trayicon时显示一个表单.我有一个问题,可以通过快速三次或四次点击trayicon来显示2个或更多表格.我不想要单例的原因是我希望每次关闭表单时都要释放它以节省内存,也许这不是一个好主意?
我有一个名为m_form1的字段.我有一个名为ShowForm1的方法; 我在双击TrayIcon时调用方法ShowForm1.
private Form1 m_form1;
private void ShowForm1()
{
if (m_form1 == null)
{
Trace.WriteLine("*CREATE*" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
m_form1.BringToFront();
m_form1.Activate();
}
Run Code Online (Sandbox Code Playgroud)
因此,当Form1需要一段时间来构造时,则可以创建2,因为当第二个调用到达时m_form1仍然为null.锁定似乎不起作用,因为它是同一个线程两个调用(我猜的是UI线程),即跟踪写出*CREATE*1两次(下面).
[3560] *CREATE*1
[3560] *CREATE*1
Run Code Online (Sandbox Code Playgroud)
更改代码以包含锁定语句对我没有帮助.
private Form1 m_form1;
private object m_Locker = new object();
private void ShowForm1()
{
lock (m_Locker)
{
if (m_form1 == null)
{
Trace.WriteLine("****CREATE****" + Thread.CurrentThread.ManagedThreadId.ToString());
m_form1 = new Form1();
m_form1.FormClosed += new FormClosedEventHandler(m_form1_FormClosed);
m_form1.Show();
}
}
m_form1.BringToFront();
m_form1.Activate();
}
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?
多谢你们
蒂姆.