Tag: lambda

如何在运行时创建表达式以在具有entity framework的GroupBy()中使用?

我正在构建一个新的扩展方法,它将动态地能够对来自Entity Framework的查询结果进行分组。 我已经能够使用LinqKit构建动态“where”表达式,但这似乎是一个不同的动物。 新扩展方法的预期用法: var results = entities.GroupBy(“someFieldName”).ToList(); 扩展方法定义: public static IQueryable<IGrouping> GroupBy( this IQueryable source, string fieldName) where TEntity : class, IDataEntity { if (string.IsNullOrEmpty(fieldName)) { return new List<IGrouping>().AsQueryable(); } var parameter = Expression.Parameter(typeof(TEntity), “x”); var fieldXExpression = Expression.Property(parameter, fieldName); var lambda = Expression.Lambda<Func>( Expression.Convert(fieldXExpression, typeof(object)), // throws error when using EF parameter); return […]

使用不带Invoke的MethodInvoker

我现在正在编写GUI应用程序一段时间,我总是使用一个方法是使用MethodInvoker + lambda函数来进行跨线程访问。 从示例中我发现我总是看到这样的东西: 版本1 if (InvokeRequired) { Invoke(new MethodInvoker(() => { Label1.Text = “Foobar”; }); } else { Label1.Text = “Foobar”; } 然而,这会导致代码重复 – >对我来说是主要的坏人。 那有什么不对呢? 版本2 MethodInvoker updateText = new MethodInvoker(() => { Label1.Text = “Foobar”; }); if (InvokeRequired) { Invoke(updateText); } else { updateText(); } 现在我将function捆绑在一个变量中,并在适当时使用Invoke或函数指针调用它。 版本2的性能更差吗? 或者我使用匿名函数是不好的做法?

关于优化传递表达式作为方法参数的建议

我非常喜欢使用lambda表达式而不是字符串来表示属性(例如ORM映射)的相对近期趋势。 强类型>>>>字符串输入。 要清楚,这就是我所说的: builder.Entity() .HasTableName( “webservice_accounts” ) .HasPrimaryKey( _ => _.Id ) .Property( _ => _.Id ).HasColumnName( “id” ) .Property( _ => _.Username ).HasColumnName( “Username” ).HasLength( 255 ) .Property( _ => _.Password ).HasColumnName( “Password” ).HasLength( 255 ) .Property( _ => _.Active ).HasColumnName( “Active” ); 在我最近的一些工作中,我需要根据表达式缓存内容,为此,我需要根据表达式创建一个键。 像这样: static string GetExprKey( Expression<Func> expr ) { string key […]

如何评估ExpressionVisitor中的表达式?

在执行Expression之前,我需要使用ExpressionVisitor来分析它。 根据我的需要,我需要评估Divide表达式的正确部分,但我不知道该怎么做。 这是我的示例代码: internal class RulesChecker : ExpressionVisitor { private readonly object data; public RulesChecker(object data) { this.data = data; } protected override Expression VisitBinary(BinaryExpression node) { if (node.NodeType == ExpressionType.Divide) { var rightExpression = node.Right; // compile the right expression and get his value } return base.VisitBinary(node); } } 假设我有这个代码来评估: Expression<Func> expression = x […]

有没有办法可以从包含代码的字符串中动态定义Predicate主体?

这可能是一个愚蠢的问题,但这里有。 我希望能够从数据库VARCHAR列或任何字符串解析的字符串动态构造谓词。 例如,假设数据库中的列包含以下字符串: return e.SomeStringProperty.Contains(“foo”); 这些代码/字符串值将存储在数据库中,知道通用“e”的可能属性是什么,并且知道它们必须返回布尔值。 然后,在一个神奇,美妙,幻想的世界中,代码可以在不知道谓词是什么的情况下执行,例如: string predicateCode = GetCodeFromDatabase(); var allItems = new List{….}; var filteredItems = allItems.FindAll(delegate(SomeObject e) { predicateCode }); 或Lambda化: var filteredItems = allItems.FindAll(e => [predicateCode]); 我知道它可能永远不会这么简单,但有没有办法,也许使用Reflection.Emit,从文本动态创建委托代码并将其提供给FindAll (或任何其他匿名/扩展)方法?

创建包含外部变量的LambdaExpression

我想创建像这样的lambda user => user.Address == address 但是没有编译一个,我想返回LambdaExpression 如果lambda像这样常量 user => user.Age == 50 然后我可以使用这种方法 public static LambdaExpression PropertyEqual(Type tEntityType, string propertyName, object value) { // entity => entity.PropName == const var itemParameter = Expression.Parameter(tEntityType, “entity”); return Expression.Lambda ( Expression.Equal ( Expression.Property ( itemParameter, propertyName ), Expression.Constant(value) // Tried to replace this with Expression.Parameter or Expression.Variable […]

具有generics类属性的LINQ表达式

我想将一个IQueryable和一组id传递给一个方法,该方法根据这些id过滤IQueryable。 由于id可以是long或int,因此应该通常解决。 我想出了以下内容: public static IEnumerable GetModified(IQueryable objects, TId[] ids) where T : class { return objects.Where(j => ids.Contains((TId)j.GetType().GetProperty(“Id”).GetValue(j))); } 不幸的是我得到了例外: LINQ to Entities无法识别方法’System.Object GetValue(System.Object)’方法,并且此方法无法转换为商店表达式。

如何离开lambda表达式的主体

我有一些列表,我做list.ForEach( l => { … something …}) 。 现在,在某些条件下,我需要停止迭代列表,但break不起作用 – 我得到“ Control cannot leave the body of an anonymous method or lambda expression ”编译错误。 知道如何克服这种限制吗?

缩进lambda和嵌套动作

当使用lambdas时,通常是在TPL上,我会因缩进而迷失…是否有一些最佳实践来格式化? 例如,请使用以下代码: Task t1 = factory.StartNew(() => { DoSomething(); } .ContinueWith((t2) => { DoSomethingWhenComplete(); }, TaskContinuationOptions.OnlyOnRanToCompletion) ).ContinueWith((t3) => { DoSomethingOnError(); }, TaskContinuationOptions.OnlyOnFaulted); 我的“缩进”是否正确? 在该示例中,我想执行t1,然后如果它完成OK,则执行t2,并在执行t3时执行错误。 但看起来好像t3是t2的延续,而不是来自t1 …我需要在该代码中修复什么才能获得正确的行为? 我想我已经迷失在那个缩进或遗漏了一些括号……

基于AST使用And Or和Not表达的C#表达式

我想将Linq表达式用于某些动态function。 我需要And,Or和Not表达式..我不能得到太多…… 我们想检查我们的系统中是否启用了某些function,并根据该function决定是否显示菜单项。 我们已经形成了XML格式的规则,我知道将规则转换为AST但我不知道要映射到Linq表达式。 规则如下:Feature1Enabled和Feature2Eenabled或(Feature3Disabled而非Feature5Enabled) 这里“Feature1Enabled”,“Feature2Eenabled”等是该function的名称。 我们将此字符串传递给IsFeatureEnabled函数以检查是否已启用某项function。 public delegate bool IsEnabledDelegate(string name, string value); public static bool IsFeatureEnabled(string name, string value) { if (name == “MV”) return true; if (name == “GAS” && value == “G”) return true; //More conditions goes here return false; } static void Main(string[] args) { Expression<Func> featureEnabledExpTree = (name, value) […]