我在C#驱动程序中有一个聚合查询,如下所示:
var result = await _records.Aggregate()
.Match(record => record.Statuses.Any(status => status.Status == currentStatus))
.Unwind(record => record.Statuses)
.Sort(Builders<BsonDocument>.Sort.Descending("statuses.date"))
.Group(doc => doc["_id"], group => new { Id = group.Key, CurrentStatus = group.First()["statuses"] })
.Match(arg => arg.CurrentStatus["status"] == BsonValue.Create(currentStatus.ToString()))
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
它匹配以下shell语法:
db.records.aggregate(
[
{
$match : { "statuses.status" : "Finished" }
},
{
$unwind: "$statuses"
},
{
$sort: { "statuses.date":-1 }
},
{
$group: {
_id: "$_id",
current_status: { $first: "$statuses" }
}
},
{
$match : { "current_status.status" : "Finished" }
} …Run Code Online (Sandbox Code Playgroud) 请考虑以下情形
private static ConcurrentDictionary<string, ConcurrentDictionary<string, string>> CachedData;
Run Code Online (Sandbox Code Playgroud)
多个线程通过方法调用访问此变量
ConcurrentDictionary<string, string> dic = CachedData.GetorAdd(key, HeavyDataLoadMethod())
Run Code Online (Sandbox Code Playgroud)
此方法执行一些重量级操作以检索数据
private ConcurrentDictionary<string, string> HeavyDataLoadMethod()
{
var data = new ConcurrentDictionary<string,string>(SomeLoad());
foreach ( var item in OtherLoad())
//Operations on data
return data;
}
Run Code Online (Sandbox Code Playgroud)
我在这里的问题是,如果我使用GetorAdd了HeavyDataLoadMethod获取即使它不需要执行.
我想知道在这种情况下是否有某种方法可以利用延迟执行并使HeavyDataLoadMethod延迟执行,因此在真正需要之前不执行它.
(是的,我知道这就像使用ContainsKey检查一样简单而忘记它,但我对这种方法很好奇)
如果我键入以下内容:
public Response GetArticles(string Filter = String.Empty)
{
//Body
}
Run Code Online (Sandbox Code Playgroud)
Visual Studio给了我这个错误:
"Filter"的默认参数值必须是编译时常量
如果我改为String.Empty经典,""它就是固定的.
但我仍然对这个String.Empty及其行为的错误感到好奇.
在阅读了一些如何使用,foreach,linq延迟执行和迭代器在C#中工作之后.我决定尝试在一个小项目中优化基于属性的验证机制.结果:
private IEnumerable<string> GetPropertyErrors(PropertyInfo property)
{
// where Entity is the current object instance
string propertyValue = property.GetValue(Entity)?.ToString();
foreach (var attribute in property.GetCustomAttributes().OfType<ValidationAttribute>())
{
if (!attribute.IsValid(propertyValue))
{
yield return $"Error: {property.Name} {attribute.ErrorMessage}";
}
}
}
// inside another method
foreach(string error in GetPropertyErrors(property))
{
// Some display/insert log operation
}
Run Code Online (Sandbox Code Playgroud)
我觉得这很慢,但也可能是由于反射或大量的属性要处理.
所以我的问题是...... 这是最优还是很好地利用了延迟加载机制?或者我错过了什么,只是浪费了大量的资源.
注意:代码意图本身并不重要,我关心的是在其中使用延迟加载.
我想知道是否有任何策略来管理移动设备中的秘密过期.
在授权服务器允许移动客户端使用资源所有者密码流结合客户端凭证来授权他的情况下,客户端机密具有到期时间.
我已经看到有至少可以安全地存储Android应用程序秘密的方法,但是,如何在不发布新版本的应用程序的情况下管理秘密过期?
c# ×4
.net ×2
linq ×2
android ×1
app-secret ×1
compile-time ×1
dictionary ×1
ios ×1
lazy-loading ×1
mongodb ×1
oauth-2.0 ×1
parameters ×1