我一直在玩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) 我正在寻找最佳解决方案,以便在不部署/构建现有代码库的情况下轻松地将新语言添加到asp.net网站.
根据我的研究,似乎你可以动态编译资源文件到Satellite程序集,但我不确定如何使应用程序使用这些DLL一旦生成?
我看到的另一个选项是将翻译存储在数据库中,并编写自定义的ResourceProvider,以便可以使用内置的本地化方法,同时抽象实际的实现(在本例中是数据库).
无论哪种方式,此站点的前端都是相同的(meta:控件的resourcekey等).
但我正在努力决定哪种方法最容易保养.例如,发布一个新的Satellite程序集是否会重新启动应用程序池,或者是否可以很好地检查所有内容?
编辑
翻译将由第三方API提供,因此人员维护质量并不重要.由于收到的答案,我想我会加上这个.
我在尝试使用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 …
使用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,并通过代理断言调用.
任何相对简单的断言对记录器的调用的方法都会受到赞赏,但我怀疑并行测试执行会导致问题,即使可以在上面的记录器上断言调用?
关于在 ASP.Net 应用程序中使用这些变量,我遇到了一些困惑。
public static string Complete = "Complete";
据我所知,这个值对于所有用户都是全局的,但是由于应用程序池回收并且该值没有在回收时分配,所以不能保证该值存在?
public static readonly string Complete = "Complete";
该readonly标志是否意味着由于使用类的静态构造函数初始化该值始终可用,这意味着该值将始终可用?
据我所知,在这种readonly情况下会发生以下情况:
readonly和非只读版本之间有什么区别吗?我想我们也可以这样写来保证变量:
public static string Complete { get { return "Complete"; } }
阅读完以下问题后:
测试未通过IIS 请求过滤(特别是查询字符串长度)的请求并希望执行以下操作:
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 …
我一直试图让我的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)
此示例有效,但窗口未最大化,应用程序边框仍然可见. …
在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# ×6
asp.net ×3
unit-testing ×2
.net ×1
automapper ×1
automapper-3 ×1
iis ×1
liblog ×1
linq-to-sql ×1
localization ×1
wcf ×1
wpf ×1