我正在为我们这个庞大的项目创建一个更精细的过滤系统.其中一个主要谓词是能够通过字符串参数传递比较.这表现为以下形式:"> 50"或"5-10"或"<123.2"
我有什么(作为一个例子来说明)
视图模型:
TotalCost (string) (value: "<50")
Required (string) (value: "5-10")
Run Code Online (Sandbox Code Playgroud)
EF型号:
TotalCost (double)
Required(double)
Run Code Online (Sandbox Code Playgroud)
我想要使用的表达式:
model => model.Where(field => field.TotalCost.Compare(viewModel.TotalCost) && field.Required.Compare(viewModel.Required));
Run Code Online (Sandbox Code Playgroud)
我希望收到的表达:
model => model.Where(field => field.TotalCost < 50 && field.Required > 5 && field.Required < 10);
Run Code Online (Sandbox Code Playgroud)
或类似的东西
但是......我不知道从哪里开始.我把它缩小到了
public static Expression Compare<T>(this Expression<Func<T, bool>> value, string compare)
Run Code Online (Sandbox Code Playgroud)
它甚至可能不正确,但这就是我所拥有的一切.比较构建器不是问题,这很容易.困难的部分实际上是返回表达式.我从未尝试将表达式作为函数值返回.基本上我需要保留的是字段并返回一个比较表达式.
有帮助吗?:X
更新:
唉,这并不能解决我的问题.这可能是因为我在过去的23个小时里一直在努力,但我对如何将它变成一种扩展方法没有丝毫的线索.正如我所说,我想要的......基本上是一种写作方式:
var ex = new ExTest();
var items = ex.Repo.Items.Where(x => x.Cost.Compare("<50"));
Run Code Online (Sandbox Code Playgroud)
我塑造这个功能的方式(可能是完全错误的)是
public static Expression<Func<decimal, bool>> Compare(string arg)
{
if (arg.Contains("<"))
return d => d …Run Code Online (Sandbox Code Playgroud) 我有一个抽象的基类,它包含几个方法,其中一个我需要随时拦截.基类可以由用户定义的类继承,并在应用程序启动时向容器注册.如果用户尚未注册,则容器安装程序将自行注册一个.
这是问题 - 用户不必担心添加拦截器.容器应该自己添加它,无论注册组件的人和位置.
这就是我现在正在做的事情:
if(!container.Kernel.HasComponent(typeof(MyBaseComponent)))
container.Register(Component.For<MyComponent>()
.Interceptors(InterceptorReference
.ForType<MyComponentMethodInterceptor>())
.SelectedWith(new MyComponentMethodSelector()).AtIndex(1));
Run Code Online (Sandbox Code Playgroud)
MyComponentMethodSelector是一个简单的IInterceptorSelector,它检查methodname是否等于我需要拦截的那个(在这种情况下MyComponentMethodInterceptor会添加一个).
如您所见,它将检查组件是否已首先注册.
问题是 - 如果已经注册,我是否有办法添加拦截器?想到的最明显的选择是使用a IContributeComponentModelConstruction,但是在那时我将无法选择拦截器添加到的方法.还是有吗?
编辑:
我本来应该更具体一点.我只需要为特定方法添加拦截器.因此我为什么使用MyComponentMethodSelector.我知道IContributeComponentModel,我开始用它直到我意识到我无法添加方法选择器.
我在这里遇到了一些麻烦 - 当我保存或"运行自定义工具"时,应该生成C#类的T4模板拒绝成功运行.但是 - 只有当我"调试T4模板"时它才会成功运行且没有错误.
错误如下:
Error 1 Running transformation: System.MissingMethodException: Method not found: 'System.Collections.Generic.IEnumerator`1<Newtonsoft.Json.Linq.JToken> Newtonsoft.Json.Linq.JArray.GetEnumerator()'.
at JsonCSharpClassGenerator.JsonClassGenerator.GenerateClass(JObject[] examples, JsonType type)
at JsonCSharpClassGenerator.JsonClassGenerator.GenerateClasses() in c:\Users\Nero\Documents\Visual Studio 2013\Projects\BluePOCO\JsonCSharpClassGenerator\JsonClassGenerator.cs:line 82
at ApiTransformer.ClassGenerator.Generate(String json, String className) in c:\Users\Nero\Documents\Visual Studio 2013\Projects\BluePOCO\ApiTransformer\ClassGenerator.cs:line 25
at Microsoft.VisualStudio.TextTemplatingDCEBAFBE8B1AF87B73F34AE53B7F0A1037491F7FD56EC9906754016DE7399CD0992B239FF4A836115489D16A9EE78F6DCBA10BE4137758F32395F1DB7ADF7FF1.GeneratedTextTransformation.TransformText() C:\Users\Nero\documents\visual studio 2013\Projects\BluePOCO\BluePOCO\BlueprintTransformer.tt 1 1 BluePOCO
Run Code Online (Sandbox Code Playgroud)
这显然与Json.Net有关.我认为问题可能出在Json.Net软件包中,可能是版本之间存在差异 - 但解决方案中的所有项目都使用完全相同的版本.
为了记录,JsonClassGenerator就是这个文件:http://jsonclassgenerator.codeplex.com/SourceControl/latest#JsonCSharpClassGeneratorLib/JsonClassGenerator.cs
第82行是
GenerateClass(examples, rootType);
Run Code Online (Sandbox Code Playgroud)
好的解决方案是......调试.但是,我无法调试那些......好吧,在调试时拒绝bug.在这方面,我似乎已经筋疲力尽,任何想法都可以尝试?当然,模板工作正常,但每次我想通过右键单击 - >调试更新它们时必须运行它们?似乎没有按预期工作.
编辑:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="$(SolutionDir)\BluePOCO\bin\Debug\ApiTransformer.dll" #>
<#@ assembly name="$(SolutionDir)BluePOCO\bin\Debug\RestSharp.dll"#> …Run Code Online (Sandbox Code Playgroud) 我正在使用的这个项目曾经在每个 Web 请求上为每个存储库方法创建一个新的 DbContext(这意味着每个请求都创建了任意数量的 dbcontexts)。
我已经解决了每个请求只有一个上下文的问题,但是一些序列化会出现问题并出现内存不足异常。查看序列化数据,Json.Net 完全忽略了ReferenceLoopHandling.Ignore循环引用处理的枚举值。请注意,当我将其设置为 时ReferenceLoopHandling.Error,我将立即在自引用对象上收到异常。
启用和禁用代理和延迟加载都会发生这种情况。
用于 JsonSerializer 的完整设置列表:
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Local,
Formatting = Formatting.None,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
NullValueHandling = NullValueHandling.Include
我在为表单制作自定义标题栏时遇到问题.它将包含一个搜索文本框以及一些滑块,如下图所示:
现在,想象一下作为标题栏 - 所有不是控件本身的部分(由边框元素和滑块包围的文本框)都需要可以拖拽以进行拖动.
我试过这个:
<Grid MouseDown="TitleGridMouseDown">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="135"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Slider Grid.Column="1" Margin="5 15 5 0" Width="100" MouseDown="TitleGridMouseDown"/>
<Slider Grid.Column="2" Margin="5 15 5 0"/>
<Border Grid.Column="3" CornerRadius="10" BorderThickness="1" BorderBrush="White" Width="180" Height="20" Background="White">
<TextBox Background="Transparent" BorderThickness="0" Height="20"/>
</Border>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但是没有用.两个滑块之间有一小部分,就像几个像素区域一样,实际上可以工作(DragMove();在事件本身中).我在WPF中没有太多经验这种类型的东西,但我觉得这个区域缩小到了控制范围.例如,如果我将border对象放入按钮并尝试将事件绑定到按钮,则不会发生任何变化.
我该怎么做呢?