Tag: lambda

如何在lambda表达式中按字符串属性名进行选择查询?

我想使用lambda select进行查询, 如下所示: public class Foo{ public int Id {get;set;} public string Name {get;set;} public string Surname {get;set;} } var list = new List(); var temp = list.Select(x=> x(“Name”),(“Surname”)); 属性名称需要作为字符串发送,我不知道如何使用,我已经将它作为一个例子。 可能吗? 编辑: Foo list : 1 AB 2 CD 3 EF 4 GH 我不知道通用列表的类型,我有属性名称,如“姓名”,“姓” 我希望如下: Result : AB CD EF GH

有没有办法捕获lambda表达式,以便它不是编译时强制将身份作为表达式或委托类型?

假设我有一个复杂的lambda表达式,如下所示: x => xAHasValue || (xBHasValue && xC == q) || (!xCHasValue && !xAHasValue) || //…expression goes on 我想将它用作Expression<Func in(例如Linq-To-Entities) Queryable.Where方法。 我也想在Enumerable.Where方法中使用它,但Where方法只接受Func ,而不是Expression<Func 。 lambda语法本身可用于生成Expression<Func>或Func (或任何委托类型),但在此上下文中,它不能一次生成多个。 例如,我可以写: public Expression<Func> PairMatchesExpression() { return x => xA == xB; } 就像我写的那样容易: public Func PairMatchesDelegate() { return x => xA == xB; } 问题是我无法以两种方式使用相同的lambda表达式(即x => xA == xB),而无需将其物理地复制到具有两种不同返回类型的两个单独方法中,尽管编译器能够将其编译为任意一个。 […]

ValueTypes的动态表达式生成问题

我构建了一个框架,允许对表中的报表数据进行级联排序,具体取决于哪个列是主排序列。 它在很大程度上起作用,除了一个特定但重要的情况:当字段的属性是值类型时。 我收到以下错误消息: System.ArgumentException:类型’System.Int32’的表达式不能用于返回类型’System.Object’ 我知道这意味着我需要设置ValueType的值,但我不完全确定如何在这种特殊情况下。 根据一些研究和这个SO答案,我认为我需要以某种方式使用Expression.Convert 。 我的代码是生成表达式的代码。 generics类型参数T是数据“行”的类型。 GetFullSortOrder()只返回一个字符串数组,这些字符串表示类型T中也将进行排序的列(属性)的名称。 public IEnumerable<Expression<Func>> GetExpressions(string sortedColumn) where T : IReportRecord { var columns = GetFullSortOrder(sortedColumn) var typeParameter = Expression.Parameter(typeof(T)); foreach (var c in columns) { var propParameter = Expression.Property(typeParameter, c); yield return Expression.Lambda<Func>(propParameter, typeParameter); } } 当在T中选择的属性是ValueType时处理Expression.Lambda<Func>()时抛出exception。 属性框需要什么,或者在运行时才知道类型时返回正确的值?

如何从Lambda表达式的String动态创建方法

我的最终目标是创建一个函数,将函数方法名称动态传递给Hangfire库中的类。 例如,以下是非动态代码: RecurringJob.AddOrUpdate(() => myFunction(), Cron.Hourly) AddOrUpdate的第一个参数的类型是Expression 。 我的第一步是使用reflection来动态插入函数名称: Type thisControllerType = this.GetType(); MethodInfo method = thisControllerType.GetMethod(methodName); //methodName passed as string parameter RecurringJob.AddOrUpdate(() => method.Invoke(this, null), Cron.Hourly); 当我检查Hangfire仪表板时,似乎该表达式被评估为MethodBase.Invoke 。 所以我需要帮助动态传递方法名称。 这可能足以回答我的问题,但我采取的另一条路径是尝试为参数生成整个表达式。 RecurringJob.AddOrUpdate(CreateCallExpression(method), Cron.Hourly); public Expression CreateCallExpression(MethodInfo method) { //trying to pass in zero argument parameter, not sure if this syntax is correct var parameter = […]

分组通过Lambda表达式使用两列以上的列

我必须在lambda表达式中转换我给定的linq查询。 即 var scholars = (from scholar in db.Scholars join suspension in db.Suspensions on scholar.ID equals suspension.ScholarID where suspension.StartDate >= startDate && suspension.EndDate x.Suspensions.Sum(y => y.SuspensionDays)) }) .ToList() .OrderBy(x=> x.FullName);

我应该如何从List 的自定义对象中提取不同值的集合?

我有一个对象列表 – 让我们说它们是订单。 订购 OrderID Date SalesmanId … 我想从此列表中提取一个Distinct的SalesmanId列表。 做这个的最好方式是什么? 我不认为它通过手动循环……是吗? 更新感谢您的回复。 我想到了一个额外的要求(在Jon Skeets回答之后概述)并将其编码为: var salesusers = from s in lstOrders group s by new { s.SalesUserId,s.Username} into g select new { UserName = g.Key.Username, UserId = g.Key.SalesUserId }; 它有效,但我不确定这是否是正确的方法,或者我是否离开了标记? 谢谢。 更新#2:这个跑步和跑步 – 像我这样的新手可能会发现这个链接问题的答案也很有用。

对没有LINQ的匿名类型的List 进行排序

Random r = new Random(); List myList = new List(); for (int i = 0; i obj1.A.CompareTo(obj2.A) ); 上面的代码定义了一个通用List ,用100个匿名变量填充它,有两个成员A和B. 假设我想在A上对myList进行排序。最后一行尝试对列表进行排序,但是这段代码显然不能编译,因为编译器不知道对象列表包含什么。 不使用LINQ,是否可以使用lambda或类似方法对此列表进行排序?

Async / Await Lambdas

我有一个奇怪的问题,结合async / await使它工作:我创建了一个小程序,它应该基本上处理每个动作的try / catch: internal static void HandledAction(Action action, Info infoBar) { try { action(); } catch (Exception ex) { infoBar.SetError(“An Exception occured: ” + ex.Message); WriteLog(ex.StackTrace); } 看起来很花哨,但它的价值很高,因为改变error handling非常容易。 但是,如果我想在Lambda中获取数据异步,会发生什么? 让我们举一个简单的例子: private void mnuImportData_Click(object sender, RoutedEventArgs e) { ActionHelper.HandledAction(async () => { throw new NotImplementedException(“Ups”); }, infoMain); } 当然,HandledAction被调用,传递,因为它返回指针,exception被抛出,当然不会被处理。 我想我必须创建一个AsyncHandledAction,并设置动作异步,但有没有更简单的方法来解决这个问题? 我想很多人都使用中央exception处理,并且有更好的解决方案吗? 提前致谢 马蒂亚斯 […]

Lambda表达式访问对象的属性,该对象是c#中另一个对象的属性

我有这两个class: public class Contratos { //… public int EntidadeFinanceiraId { get; set; } [Column(“Nome”)] public EntidadesFinanceiras entidadeFinanceira { get; set; } //… } public class EntidadesFinanceiras { [Key] public int ID { get; set; } public string Nome { get; set; } //… } 并希望以Contratos.entidadeFinanceira.Nome为基础过滤Contratos列表。 这是根据用户选择的属性过滤列表的方法的一部分。 public IQueryable applyLambdaFilter(string val, string col, string oper, IQueryable […]

在C#中使用linq或lambda表达式返回一个集合加上一个值

我想返回一个集合加上一个值。 目前,我正在使用一个字段来创建一个新列表,向列表中添加一个值,然后返回结果。 有没有办法用linq或lambda表达式做到这一点? private List _chargeBreakdown = new List(); public ChargeDetail PrimaryChargeDetail { get; set; } public List ChargeBreakdown { get { List result = new List(_chargeBreakdown); result.Add(PrimaryChargeDetail); return result; } }