我有三个表:呼叫,附件和备注,我想显示呼叫表中的所有内容,还显示呼叫是否有附件以及呼叫是否有备注. - 通过确定是否存在带有call_id的附件或注释记录.可能有笔记和附件,或者可能没有,但我需要知道.
表结构:
要求:
call_id | title | description
Run Code Online (Sandbox Code Playgroud)
附件:
attach_id | attach_name | call_id
Run Code Online (Sandbox Code Playgroud)
笔记:
note_id | note_text | call_id
Run Code Online (Sandbox Code Playgroud)
如果我写:
SELECT c.call_id
, title
, description
, count(attach_id)
FROM calls c
LEFT JOIN attachments a ON c.call_id = a.call_id
GROUP BY c.call_id
, title
, description
Run Code Online (Sandbox Code Playgroud)
给我一个所有电话和附件数量的列表.
如何添加包含注释数量的列或指示有注释的列?
有任何想法吗?
谢谢.
我已经构建了一个从互联网上下载文件的简单控制台应用程序.
因为我遇到了WebClient问题,所以决定使用HttpClient编写我的应用程序.
基本上我正在请求读取标题,然后使用ReadAsStreamAsync我正在获取流,我正在使用复制到本地文件CopyToAsync.
我找到了支持IProgress的流的扩展方法:
public static class StreamExtensions
{
public static async Task CopyToAsync(this Stream source, Stream destination, IProgress<long> progress, CancellationToken cancellationToken = default(CancellationToken), int bufferSize = 0x1000)
{
var buffer = new byte[bufferSize];
int bytesRead;
long totalRead = 0;
while ((bytesRead = await source.ReadAsync(buffer, 0, buffer.Length, cancellationToken)) > 0)
{
await destination.WriteAsync(buffer, 0, bytesRead, cancellationToken);
cancellationToken.ThrowIfCancellationRequested();
totalRead += bytesRead;
//Thread.Sleep(10);
progress.Report(totalRead);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序有效,但我得到了错误的进度信息.
例如,当下载2个文件时,我在输出窗口中看到了这个:
file1.tmp 60.95%
file2.tmp 98.09%
file1.tmp 60.98%
file2.tmp …Run Code Online (Sandbox Code Playgroud) 我的数据库有3个表,如下所示:

订单表包含如下数据:
OrderID OperatorID GroupID OrderDesc Status Cash ...
--------------------------------------------------------------------------
1 1 1 small order 1 100
2 1 1 another order 2 0
3 1 2 xxxxxxxxxxx 2 1000
5 2 2 yyyyyyyyyyy 2 150
9 5 1 xxxxxxxxxxx 1 0
10 NULL 2 xxxxxxxxxxx 1 10
11 NULL 3 xxxxxxxxxxx 1 120
Run Code Online (Sandbox Code Playgroud)
经营者表:
OperatorID Name GroupID Active
---------------------------------------
1 John 1 1
2 Kate 1 1
4 Jack 2 1
5 Will 1 0
6 Sam 3 1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用自己的布局引擎创建自定义Panel控件.我需要添加到我的面板中的每个控件都添加到下面并采用全宽(-padding),如下所示:

以下是我的代码:
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Layout;
namespace VContainer
{
internal class VerticalFillList : Panel
{
public VerticalFillList()
{
AutoScroll = true;
MinimumSize = new Size(200, 200);
Size = new Size(200, 300);
Padding = new Padding(10);
}
private readonly VerticalFillLayout _layoutEngine = new VerticalFillLayout();
public override LayoutEngine LayoutEngine
{
get { return _layoutEngine; }
}
private int _space = 10;
public int Space
{
get { return _space; }
set
{
_space = value;
Invalidate();
}
}
}
internal …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有3个任务负责从数据库中获取数据.
直到现在我已经一个接一个地执行了所有任务.如果第一次完成并有结果然后这是我的数据,如果现在我开始第二个任务,我再次检查.
最近我发现了一些信息,我可以启动多个任务,并在其中一个完成使用后继续Task.Factory.ContinueWhenAny.如果我的所有任务都没有抛出任何异常,这可以正常工作,但如果任何任务失败,我无法得到我想要的结果.
例如:
var t1 = Task.Factory.StartNew(() =>
{
Thread.Sleep(5000);
return 1;
});
var t2 = Task.Factory.StartNew(() =>
{
Thread.Sleep(2000);
throw new Exception("My error");
return 2;
});
var t3 = Task.Factory.StartNew(() =>
{
Thread.Sleep(4000);
return 3;
});
Task.Factory.ContinueWhenAny(new[] {t1, t2,t3}, (t) =>
{
Console.WriteLine(t.Result);
});
Run Code Online (Sandbox Code Playgroud)
此代码启动3个任务,并等待其中一个完成.因为t22秒后抛出异常,所以它是可用的ContinueWhenAny.
从上面的代码我想得到3 t.Result.
是否有选项只在任务成功完成后继续?就像是Task.Factory.ContinueWhenAnyButSkipFailedTasks
编辑1 这是我现在基于@Nitram答案的解决方案:
var t1 = Task.Factory.StartNew(() =>
{
var rnd = new Random();
Thread.Sleep(rnd.Next(5,15)*1000);
throw new Exception("My error");
return 1;
});
var …Run Code Online (Sandbox Code Playgroud) 我正在使用 ASP.NET Identity 2.0 构建 2 因子注册 API。
我想让用户能够按需确认他们的电话号码,所以即使他们在注册时没有确认他们的电话号码,他们也总是可以请求将通过 SMS 发送的新令牌(向我的 API 发出请求)并在页面上输入它(也向我的 API 发出请求)。
在负责发送令牌的方法中,我正在生成令牌并发送它,如下所示:
var token = await UserManager.GeneratePhoneConfirmationTokenAsync(user.Id);
var message = new SmsMessage
{
Id = token,
Recipient = user.PhoneNumber,
Body = string.Format("Your token: {0}", token)
};
await UserManager.SmsService.SendAsync(message);
Run Code Online (Sandbox Code Playgroud)
和内部用户管理器:
public virtual async Task<string> GeneratePhoneConfirmationTokenAsync(TKey userId)
{
var number = await GetPhoneNumberAsync(userId);
return await GenerateChangePhoneNumberTokenAsync(userId, number);
}
Run Code Online (Sandbox Code Playgroud)
每次我调用我的方法时,我都会收到包含令牌的 SMS 消息,问题是用户可以无限次调用该方法,并且很容易产生成本 - 每条 SMS = 成本。
我想将用户可以对该方法执行的请求数量限制为每 X 分钟一次。
我还注意到,当我执行多个请求时,我得到了相同的令牌,我已经测试了我的方法,看起来这个令牌在 3 分钟内有效,所以如果我在那个分钟的时间窗口内请求,我将得到相同的令牌。
理想情况下,我希望有一个参数可以让我指定请求和电话确认令牌寿命之间的时间间隔。
我尝试使用以下方法在 UserManager 类中设置令牌寿命:
appUserManager.UserTokenProvider = …Run Code Online (Sandbox Code Playgroud) 在我的 API 中,我有 2 个端点,首先生成电子邮件以重置密码表单(我使用 生成令牌UserManager.GeneratePasswordResetTokenAsync)。
第二个端点用于实际密码重置(我使用UserManager.ResetPasswordAsync)。
我的要求是验证密码重置所需的令牌是否未过期。
在 GitHub 上搜索我发现了这个问题,并且从设计上我发现这是不可能的。
然而,更深入地搜索我发现UserManager.ResetPasswordAsync 在内部使用ValidateAsync来自Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider
有了这个,我创建了这个扩展方法:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using System;
using System.Globalization;
using System.IO;
using System.Text;
namespace Api.Extensions
{
public enum TokenValidity
{
VALID,
INVALID,
INVALID_EXPIRED,
ERROR
}
public static class UserManagerExtensions
{
public static TokenValidity IsResetPasswordTokenValid<TUser, TKey>(this UserManager<TUser, TKey> manager, TUser user, string token) where TKey : IEquatable<TKey> where TUser : class, IUser<TKey>
{
return IsTokenValid(manager, user, "ResetPassword", …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我有一个负责所有数据库操作的类.它从主类调用,并在动作完成后使用委托调用方法.因为它是异步的,我必须在我的GUI上使用invoke,所以我创建了一个简单的扩展方法:
public static void InvokeIfRequired<T>(this T c, Action<T> action)
where T: Control
{
if (c.InvokeRequired)
{
c.Invoke(new Action(() => action(c)));
}
else
{
action(c);
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在textBox上调用它时,这工作正常:
textBox1.InvokeIfRequired(c => { c.Text = "it works!"; });
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在ToolStripStatusLabel或ToolStripProgressBar上调用它时,我收到一个错误:
类型'System.Windows.Forms.ToolStripStatusLabel'不能在泛型类型或方法'SimpleApp.Helpers.InvokeIfRequired(T,System.Action)'中用作类型参数'T'.没有从'System.Windows.Forms.ToolStripStatusLabel'到'System.Windows.Forms.Control'的隐式引用转换.
我知道这可能是一个简单的修复,但我只能处理它:/
在负责验证的类内部我有简单的规则:
RuleFor(u => u.Id)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Id is required")
.Must(ValidateId);
Run Code Online (Sandbox Code Playgroud)
下面是我的ValidateId功能:
private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context)
{
if (id=="test")
{
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing");
return false;
}
var idValid = IdValidator.IsValid(id);
if (!idValid)
{
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行我的验证器,我会得到默认错误,而不是我在函数中指定的自定义错误。
我尝试使用以下方法设置它们:
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
Run Code Online (Sandbox Code Playgroud)
但没有任何运气。
如何在验证函数中定义错误消息?
我已经使用 ASP.NET Identity 2.2.1 成功构建了简单的注册系统。
我只需要 API,所以我构建了允许使用 route 创建帐户的简单控制器account/create,当创建帐户时,用户会收到带有确认电话所需的令牌的 SMS 消息,同时我生成验证电子邮件地址所需的链接,我正在将其发送到用户电子邮件地址。然后用户需要从 SMS 输入令牌(向 请求account/confirm_phone)并单击他收到的电子邮件中的链接。
激活账户需要这两个操作,这部分工作正常。
我需要将电子邮件链接更改为电子邮件令牌,类似于用于确认电话号码的令牌,因此用户不必单击链接,而是必须输入该令牌(请求到account/confirm_email)
方法GenerateEmailConfirmationTokenAsync返回很长的代码,成为电子邮件中发送的链接的一部分,我希望它返回 6 位令牌。
我无法重用,GeneratePhoneConfirmationTokenAsync因为这将生成与通过 SMS 发送相同的令牌。
我在互联网上搜索过,但找不到任何关于如何自定义GenerateEmailConfirmationTokenAsync方法生成的令牌的信息。
是否可以配置该令牌生成器,以便它返回 6(或任何可配置长度)数字代码,我可以用它来确认用户电子邮件地址。
我知道将链接发送给用户是更好的选择,但正如我写的那样,这是我得到的要求,我无法改变它。