小编Tho*_*fel的帖子

Linq to Entities中的动态where子句(OR)

这里的帖子中,我学习了如何使用Linq的延迟执行来构建动态查询.但查询实际上是使用WHERE条件的AND连接.

如何使用OR逻辑实现相同的查询?

由于Flags枚举,查询应搜索Username,WindowsUsername两者:

public User GetUser(IdentifierType type, string identifier)
{
    using (var context = contextFactory.Invoke())
    {
        var query = from u in context.Users select u;

        if (type.HasFlag(IdentifierType.Username))
            query = query.Where(u => u.Username == identifier);

        if (type.HasFlag(IdentifierType.Windows))
            query = query.Where(u => u.WindowsUsername == identifier);

        return query.FirstOrDefault();
    }
}
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework where-clause

18
推荐指数
1
解决办法
1万
查看次数

DateTimeOffset解析和自定义时区

我们将 XML DateTime 值解析为 DateTimeOffset 值。根据DateTime 的 W3C XSD 文档,该类型可能有时区信息,也可能没有。

我们的要求是:

  • 如果 XML 中提供了时区信息,请使用此时区
  • 如果未提供时区信息,则假定它是预定义的可配置时区(而不是服务器中的时区)中的本地时间。

问题是,当没有时区的 XML DateTime 被解析为 DateTimeOffset 时,它默认使用本地(系统)时区。似乎无法覆盖默认时区,也无法识别时区是在内部解析还是添加的。

有什么方法可以指定 DateTimeOffset 解析使用的默认时区吗?
如果不是,如何确定在解析 DateTimeOffset 期间是否自动解析或添加了时区?

我觉得奇怪的是,不支持像设置当前区域性那样为 .NET 应用程序设置时区。

因此,解决此问题的唯一方法似乎是首先将值解析为 DateTime 并检查 Kind 属性。如果 Kind 不是Unspecified,则再次将该值解析为 DateTimeOffset:

/*
sample values:
- 2015-06-03T10:47:01
- 2015-06-03T07:47:01Z
- 2015-06-03T10:47:01+03:00
*/

DateTimeOffset dto;
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(ConfigurationManager.AppSettings["DefaultTimeZone"]);
var dt = DateTime.Parse(value);

if (dt.Kind == DateTimeKind.Unspecified)
{
    dto = new DateTimeOffset(dt, timeZone.GetUtcOffset(dt));
}
else
{
    dto = DateTimeOffset.Parse(value);
}
Run Code Online (Sandbox Code Playgroud)

c# timezone datetimeoffset timezone-offset

7
推荐指数
1
解决办法
6320
查看次数

RequestAdditionalTime无效

我有一个Windows服务,将文件导入数据库.当服务收到停止通知时,它应该尽可能完成当前导入.可能需要几分钟才能完成.
因此,我使用该ServiceBase.RequestAdditionalTime方法向SCM发出服务仍在工作且可操作的信号.

protected override void OnStop()
{
   var waitTime = TimeSpan.FromSeconds(5);
   var additionalWaitTime = TimeSpan.FromMinutes(3);

   Trace.Write("Stopping service...");

   var task = Task.Factory.StartNew(() => worker.Stop());
   while (!task.Wait(waitTime))
   {
     Trace.Write("Requesting additional time...");

     RequestAdditionalTime((int)additionalWaitTime.TotalMilliseconds);

     Trace.Write("Waiting for {1} to complete...");
   }

   Trace.Write("Service stopped.");
}
Run Code Online (Sandbox Code Playgroud)

在测试时,我找不到使用该RequestAdditionalTime方法的服务的任何不同行为.如果我删除了RequestAdditionalTime呼叫,则服务的行为方式相同:

  • 在服务停止时,SCM等待大约2分钟并报告服务没有响应(错误1053).之后,服务状态一直保持Stopping到我的工作人员完成为止.
  • 在关机时,系统不会等待额外的时间.它似乎在5秒后杀死所有服务(注册表项WaitToKillServiceTimeout)

有什么影响RequestAdditionalTime?我应该在哪里看到使用它时的差异,我该如何测试呢?有几次我读到,如果没有请求额外的时间,SCM将终止服务.但我看不出那种行为.

所有在我的本地开发机器(Win 8.1)上运行的测试,假设其行为与Windows Server OS上的行为相同.

c# windows windows-services service-control-manager

5
推荐指数
0
解决办法
115
查看次数

AutoMapper展平嵌套集合

我试图弄清楚如何将商家集合展平,每个商家包含订单集合到OrderViewModel的平面列表.

在这里我的DTO:

public class Merchant
{
    public string MerchantName { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public string OrderId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是视图模型:

public class OrderViewModel
{
    public string MerchantName { get; set; }
    public string OrderId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是一个压扁列表<商家>到一个列表<OrderViewModel>而下面的测试结构应导致6个视图模型:

var myMerchants = new List<Merchant>
{
    new Merchant
    {
        MerchantName = "Merchant X",
        Orders = new List<Order>
        {
             new Order { OrderId …
Run Code Online (Sandbox Code Playgroud)

c# automapper

4
推荐指数
1
解决办法
3508
查看次数

Unity IoC:"操作可能会破坏运行时的稳定性"

是否可以在UnityContainer中配置的另一种类型的构造函数中实例化UnityContainer中配置的类型?根据我目前的解决方案,我得到了一个

ResolutionFailedException:
依赖项的解析失败,type ="Sample.IMyProcessor",name ="(none)".
在解决时发生异常:
例外是:VerificationException - 操作可能会破坏运行时的稳定性.

问题是我的第二个类(FileLoader)有一个应该在第一个构造函数中计算的参数:

MyProcessor类的构造函数:

public class MyProcessor : IMyProcessor
{
    private readonly IFileLoader loader;
    private readonly IRepository repository;

    public MyProcessor(IRepository repository, string environment, Func<SysConfig, IFileLoader> loaderFactory)
    {
        this.repository = repository;
        SysConfig config = repository.GetConfig(environment);

        loader = loaderFactory(config);
    }

    public void DoWork()
    {
        loader.Process();
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是UnityContainer配置的Main函数:

public static void Run()
{
    var unityContainer = new UnityContainer()
    .RegisterType<IRepository, MyRepository>()
    .RegisterType<IFileLoader, FileLoader>()
    .RegisterType<IMyProcessor, MyProcessor>(new InjectionConstructor(typeof(IRepository), "DEV", typeof(Func<SysConfig, IFileLoader>)));

    //Tests
    var x = …
Run Code Online (Sandbox Code Playgroud)

dependency-injection inversion-of-control unity-container

3
推荐指数
1
解决办法
898
查看次数