小编Mig*_*Mig的帖子

LINQ-SQL重用 - CompiledQuery.Compile

我一直在玩LINQ-SQL,试图获得可重用的表达式块,我可以热插入其他查询.所以,我从这样的事情开始:

Func<TaskFile, double> TimeSpent = (t =>
t.TimeEntries.Sum(te => (te.DateEnded - te.DateStarted).TotalHours));
Run Code Online (Sandbox Code Playgroud)

然后,我们可以在下面的LINQ查询中使用上面的内容(LINQPad示例):

TaskFiles.Select(t => new {
    t.TaskId,
    TimeSpent = TimeSpent(t),
})
Run Code Online (Sandbox Code Playgroud)

这会产生预期的输出,除了为插入的表达式生成每行的查询.这在LINQPad中可见.不好.

无论如何,我注意到了这个CompiledQuery.Compile方法.虽然这需要一个DataContext参数,我想我会包括忽略它,并尝试相同Func.所以我最终得到了以下内容:

static Func<UserQuery, TaskFile, double> TimeSpent =
     CompiledQuery.Compile<UserQuery, TaskFile, double>(
        (UserQuery db, TaskFile t) => 
        t.TimeEntries.Sum(te => (te.DateEnded - te.DateStarted).TotalHours));
Run Code Online (Sandbox Code Playgroud)

请注意,我没有使用db参数.但是,现在当我们使用此更新参数时,仅生成1个 SQL查询.Expression已成功转换为SQL并包含在原始查询中.

所以我的最终问题是,是什么让人CompiledQuery.Compile如此特别?似乎DataContext根本不需要该参数,此时我认为它更像是生成完整查询的便利参数.

使用这样的CompiledQuery.Compile方法会被认为是个好主意吗?这似乎是一个大黑客,但它似乎是LINQ重用的唯一可行途径.

UPDATE

使用陈述中的第Func一个Where,我们会看到以下异常,如下所示:

NotSupportedException: Method 'System.Object DynamicInvoke(System.Object[])' has no supported translation to SQL. …
Run Code Online (Sandbox Code Playgroud)

linq-to-sql

14
推荐指数
1
解决办法
2554
查看次数

ASP.Net本地化(Satellite程序集与自定义ResourceProvider的DB)

我正在寻找最佳解决方案,以便在不部署/构建现有代码库的情况下轻松地将新语言添加到asp.net网站.

根据我的研究,似乎你可以动态编译资源文件到Satellite程序集,但我不确定如何使应用程序使用这些DLL一旦生成?

我看到的另一个选项是将翻译存储在数据库中,并编写自定义的ResourceProvider,以便可以使用内置的本地化方法,同时抽象实际的实现(在本例中是数据库).

无论哪种方式,此站点的前端都是相同的(meta:控件的resourcekey等).

但我正在努力决定哪种方法最容易保养.例如,发布一个新的Satellite程序集是否会重新启动应用程序池,或者是否可以很好地检查所有内容?

编辑

翻译将由第三方API提供,因此人员维护质量并不重要.由于收到的答案,我想我会加上这个.

c# asp.net localization

8
推荐指数
1
解决办法
1300
查看次数

使用WCF使用REST服务 - 可选的查询字符串参数?

我在尝试使用WCF使用简单服务时遇到问题.到目前为止,除了实现可选的查询字符串参数之外,一切都进展顺利.界面看起来有点像这样:

[ServiceContract]
[XmlSerializerFormat]
public interface IApi
{
    [OperationContract]
    [WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
    object GetStuff(string param, int top, DateTime first);
}
Run Code Online (Sandbox Code Playgroud)

然后通过创建一个继承的类来消耗它ClientBase<IApi>.我尝试了几种方法使参数可选:

1)使参数可以为空

这没用.我从QueryStringConverter另一个问题得到一条消息:WCF服务合同可以有一个可以为空的输入参数吗?

2)URL末尾的一个参数

因此,我考虑将UriTemplate更改为更通用,构建查询字符串并将其作为参数传递.这似乎也不起作用,因为传入的值被编码,使得它不被服务器识别为查询字符串.

例:

[WebGet(UriTemplate = "/url/{query}")]
Run Code Online (Sandbox Code Playgroud)

3)Hackish Solution

到目前为止我找到的唯一方法是将所有参数更改为字符串,并且这里似乎允许使用NULL.

例:

[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
object GetStuff(string param, string top, string first);
Run Code Online (Sandbox Code Playgroud)

此接口的使用仍然接受正确的变量类型,但是ToString被使用.Thes查询字符串参数仍出现在实际请求中.

那么,使用WCF 消费 REST服务有没有办法让查询字符串参数可选?

更新 - 如何修复

提出了创建服务行为的建议.这继承自WebHttpBehaviour.它看起来如下:

public class Api : ClientBase<IApi>
{
    public Api() : base("Binding")
    {
        Endpoint.Behaviors.Add(new NullableWebHttpBehavior());
    }
}
Run Code Online (Sandbox Code Playgroud)

该NullableWebHttpBehavior可在下列问题#1中找到:一个WCF服务合同可以有一个为空的输入参数?.唯一的问题是,ConvertValueToString …

.net c# wcf

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

LibLog - 断言对记录器的调用

使用LibLog时,是否可以断言对记录器的调用?鉴于wiki列出了以下用法示例:

public class MyClass
{
    private static readonly ILog Logger = LogProvider.For<MyClass>(); 
}
Run Code Online (Sandbox Code Playgroud)

这里的记录器是一个隐藏在消费者手中的实现细节,这是使用这个库的最大好处.这样库消费者就不必担心如何实例化记录器.看看这篇博文:

http://dhickey.ie/2015/06/capturing-log-output-in-tests-with-xunit2/

似乎添加了大量的锅炉板以捕获日志输出,我不完全确定该方法,因为它在单元测试中也使用了重定向的Serilog输出,这看起来很奇怪,因为库应该只依赖关于日志抽象?

我目前唯一能想到的选择是:

注入记录器 - 这对于库的使用者来说可能是奇怪的,然后每个库都会带有它自己的ILogger需要注入的定义,从而破坏了抽象的优点.

连接到真实的日志记录框架 - 将LibLog的当前LogProvider设置为使用Log4Net或类似,然后以某种方式尝试将模拟/存根记录器注入Log4Net,并通过代理断言调用.

任何相对简单的断言对记录器的调用的方法都会受到赞赏,但我怀疑并行测试执行会导致问题,即使可以在上面的记录器上断言调用?

c# unit-testing liblog

6
推荐指数
1
解决办法
724
查看次数

C# ASP.Net Webforms - 字符串 - 静态与静态只读

关于在 ASP.Net 应用程序中使用这些变量,我遇到了一些困惑。

public static string Complete = "Complete";

据我所知,这个值对于所有用户都是全局的,但是由于应用程序池回收并且该值没有在回收时分配,所以不能保证该值存在?

public static readonly string Complete = "Complete";

该readonly标志是否意味着由于使用类的静态构造函数初始化该值始终可用,这意味着该值将始终可用?

据我所知,在这种readonly情况下会发生以下情况:

  1. 访问变量
    • 类是构造的吗?不?分配变量
  2. 应用程序重启
  3. 前往 1

readonly和非只读版本之间有什么区别吗?我想我们也可以这样写来保证变量:

public static string Complete { get { return "Complete"; } }

c# asp.net

5
推荐指数
1
解决办法
3016
查看次数

Web API - 处理所有请求和错误

阅读完以下问题后:

测试未通过IIS 请求过滤(特别是查询字符串长度)的请求并希望执行以下操作:

  • 防止 IIS 劫持任何错误
  • Web API / ASP.Net 中的钩子用于处理这些错误

web.config 中的IIShttpErrors部分设置如下:

 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <httpErrors existingResponse="PassThrough" />
 </system.webServer>
Run Code Online (Sandbox Code Playgroud)

当遇到太长的请求时,我从 Web API 返回的响应如下:

HTTP/1.1 404 Not Found
Date: Thu, 09 Apr 2015 10:58:34 GMT
Server: Microsoft-IIS/7.5
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)

如果删除httpErrors配置部分,我们将返回 IIS 错误消息 (404.15)。为了尝试解决路由未被命中的问题,我尝试定义一个捕获所有路由来处理任何未知的 URL:

config.Routes.MapHttpRoute(
    name: "CatchAll",
    routeTemplate: "{*url}",
    defaults: new { controller = "Error", action = "NotFound"});
Run Code Online (Sandbox Code Playgroud)

不幸的是,这个控制器动作从未被击中。之后,我想我应该尝试 Web API 跟踪模块来查看是否有任何Web …

c# asp.net iis asp.net-web-api2

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

WPF多监视器问题 - WindowState

我一直试图让我的WPF应用程序跨越多个监视器一段时间,并且几乎让它工作.

当我设置以下行时,似乎出现了这个问题:

win1.WindowState = WindowState.Maximized
Run Code Online (Sandbox Code Playgroud)

这会导致应用程序仅跨越主屏幕.

我的代码如下:

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 win1 = new Window1();
        win1.WindowStartupLocation = WindowStartupLocation.Manual;
        win1.Width = 2560;
        win1.Height = 1024;
        win1.Left = 0;
        win1.Top = 0;
        win1.Topmost = true;
        win1.Background = new SolidColorBrush(Colors.Black);
        win1.WindowStyle = WindowStyle.None;
        win1.Show();
        win1.Focus();
    }
}
Run Code Online (Sandbox Code Playgroud)

在窗口1内:

public partial class Window1 : Window
{
    public Window1()
    {

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Maximized;
    }
}
Run Code Online (Sandbox Code Playgroud)

此示例有效,但窗口未最大化,应用程序边框仍然可见. …

wpf multiple-monitors

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

AutoMapper null源值和自定义类型转换器,无法映射?

在AutoMapper中使用自定义类型转换器(ITypeConverter)时,如果源值为null,则似乎不会输入类型转换器代码,例如:

Mapper.CreateMap<string, Enum>().ConvertUsing<EnumConverter>();

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>("StringValue1"));
Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>(null);
Assert.AreEqual(Enum.Value1, Mapper.Map<Enum?>(null);
Run Code Online (Sandbox Code Playgroud)

类型转换器看起来像:

public class EnumConvertor: ITypeConverter<string, Enum>
{
    public Enum Convert(ResolutionContext context)
    {
        string value = (string) context.SourceValue;

        switch (value)
        {
            case "StringValue2":
                return Enum.Value2;
            case "StringValue3":
                return Enum.Value3;
            case "StringValue1":
            default:
                return Enum.Value1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在最后两个案例中,结果如下:

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum>(null);
Run Code Online (Sandbox Code Playgroud)

0 - 不是有效的枚举值

Assert.AreEqual(Enum.Value1, Mapper.Map<Enum?>(null);
Run Code Online (Sandbox Code Playgroud)

空值

从调试到测试,在这两种情况下,自定义TypeConverter永远不会被击中,似乎AutoMapper在映射器中有一些初始检查要映射而不需要求助于TypeConverter?

如果我指定一个空字符串(""),则测试按预期工作.

c# unit-testing automapper automapper-3

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