Tag: lambda

是否可以将linq的reflection用于实体?

我试图通过创建一个扩展方法来一般地处理过滤来清理我的代码。 这是我想要清理的代码。 var queryResult = (from r in dc.Retailers select r); if (!string.IsNullOrEmpty(firstName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(firstName.Trim(), ex.FirstName.Trim()) > 0); if (!string.IsNullOrEmpty(lastName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(lastName.Trim(), ex.LastName.Trim()) > 0); if (!string.IsNullOrEmpty(companyName)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(companyName.Trim(), ex.CompanyName.Trim()) > 0); if (!string.IsNullOrEmpty(phone)) queryResult = queryResult.Where(ex => SqlFunctions.PatIndex(phone.Trim(), ex.Phone.Trim()) > 0); if (!string.IsNullOrEmpty(email)) queryResult = […]

在表达式树中使用可空类型

我有一个扩展方法,使用字符串值动态过滤Linq到实体结果。 它工作正常,直到我用它来过滤可空列。 这是我的代码: public static IOrderedQueryable OrderingHelperWhere(this IQueryable source, string columnName, object value) { ParameterExpression table = Expression.Parameter(typeof(T), “”); Expression column = Expression.PropertyOrField(table, columnName); Expression where = Expression.GreaterThanOrEqual(column, Expression.Constant(value)); Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); Type[] exprArgTypes = { source.ElementType }; MethodCallExpression methodCall = Expression.Call(typeof(Queryable), “Where”, exprArgTypes, source.Expression, lambda); return (IOrderedQueryable)source.Provider.CreateQuery(methodCall); } […]

C#3.0:需要从List 返回重复项

我在C#中有一个List 对象,我需要一种方法来返回列表中被认为是重复的对象。 我不需要Distinct结果集,我需要一个我将从我的存储库中删除的项目列表。 为了这个例子,让我说我有一个“汽车”类型的列表,我需要知道这些汽车中的哪一个与列表中的另一辆汽车颜色相同。 以下是列表中的汽车及其颜色属性: Car1.Color = Red; Car2.Color = Blue; Car3.Color = Green; Car4.Color = Red; Car5.Color = Red; 对于这个例子,我需要结果(IEnumerable ,List 或其他)来包含Car4和Car5,因为我想从我的存储库或数据库中删除这些,这样我的存储库中每种颜色只有一个汽车。 任何帮助,将不胜感激。

在C#中连接Lambda函数

使用C#3.5我想构建一个谓词,逐个发送到where子句。 我创建了一个非常简单的控制台应用程序来说明我到达的解决方案。 这非常有效。 绝对完美。 但我不知道如何或为什么。 public static Func GetPredicate() { Func predicate = null; predicate += t => t.Response == “00”; predicate += t => t.Amount < 100; return predicate; } 当我说’谓词+ =’时,这是什么意思? 谓词 – =似乎什么都不做,编译器不喜欢^ =,&=,* =,/ =。 编译器不喜欢’predicate = predicate + t => t.Response ….’。 我偶然发现了什么? 我知道它的作用,但它是如何做到的? 如果有人想深入研究更复杂的lambda,请这样做。

转换包含到表达式树

相关: 创建具有3个条件的Lambda表达式 请考虑以下代码: from a in myTbl where a.Address.Contains(strToCheck) select a 我如何将其转换为表达式树并使用表达式编写上面的代码? 主要问题是将a.Address.Contains(strToCheck)转换为Expression Tree 。 编辑1)地址是一个string字段, strToCheck是一个string 谢谢

如何在C#中使用Enumerable获取备用元素

这是我的问题的延续: 如何在C#中使用Enumarable来反转一系列元素? 现在我只需要替代元素。 这是我使用for循环的解决方案: int Max = 10; int limit = 5; Dictionary MyDict = new Dictionary(); int j = 0; for (int i = 0; i = limit) MyDict.Add((i+1).ToString(), “None”); else MyDict.Add((i+1).ToString(), j.ToString()); j+=2; } 输出就像 { “1” “0”} { “2” “2”} { “3” “4”} { “4” “6”} { “5” “8”} { “6” “None”} […]

HTMLAgilityPack表达式不能包含lambda表达式

我想要div的InnerText叫album_notes。 正如我在其他许多地方所做的那样,我的代码如下: public void Album_Notes(HtmlAgilityPack.HtmlDocument bandHTML) { this.lblNotes.Text = bandHTML.DocumentNode.Descendants(“div”).First(x => x.Id == “album_notes”).InnerHtml; TextBlock,lblNotes最终没有文本作为结果。 如果我在调试模式下打开QuickWatch,我会得到以下结果: 表达式不能包含lambda表达式 即使我在同一个应用程序中的其他地方至少使用过10次完全相同的语法。 奇怪的是,它实际上并没有抛出错误或任何东西,它只是用空字符串填充TextBlock。 我的代码出了什么问题?

LinqKit的扩展器是否有一个特殊原因无法从字段中获取表达式?

我正在使用LinqKit库,它允许动态组合表达式。 这是编写Entity Framewok数据访问层的纯粹幸福,因为可以选择重复使用和组合多个表达式,这样就可以实现可读和高效的代码。 考虑以下代码: private static readonly Expression<Func> _selectMessageViewExpr = ( Message msg, int requestingUserId ) => new MessageView { MessageID = msg.ID, RequestingUserID = requestingUserId, Body = ( msg.RootMessage == null ) ? msg.Body : msg.RootMessage.Body, Title = ( ( msg.RootMessage == null ) ? msg.Title : msg.RootMessage.Title ) ?? string.Empty }; 我们声明了一个将Message投影到MessageView上的表达式(为了清楚起见,我删除了细节)。 现在,数据访问代码可以使用此表达式来获取单个消息: […]

multithreading和lambda变量范围

我正在使用一个管理线程池来运行操作的类。 最初它被编码为采取Action(没有参数),我这样称呼它: void LoadTasks() { string param; // some code loops and changes param { threadPool.EnqueueTask(() => SomeMethod(param)); } } 由于线程运行一些很好,但偶尔param变量不是我所期望的…它是一个“更新”的值,而不是我打算发送给该方法。 更改线程池以接受Action并在没有lambda的情况下调用 – 就像这个threadPool.EnqueueTask(SomeMethod, param) – 解决了我的问题。 关于线程安全,我看到了很多关于C#lambdas的问题。 例如,lambdas 的公认答案 比您预期的更不可能是线程安全的。 我发现关于lambdas / closures / scoping的其他问题和答案令人困惑。 所以我正在寻找lambdas和变量范围的解释,理想情况与我的例子中的问题有关。

并且还在几个Expression <Func >之间:从范围引用

我有3个谓词,我想在AndAlso之间做一个AndAlso 。 我在板上发现了几个样本,但无法解决我的问题。 这些谓词是: Expression<Func> 我有这个代码: Expression<Func> predicate1 = ……; Expression<Func> predicate2 = ……; Expression<Func> predicate3 = ……; 我创建了一个扩展方法来创建一个“AndAlso”: public static Expression<Func> AndAlso( this Expression<Func> expr, Expression<Func> exprAdd) { var param = Expression.Parameter(typeof(T), “p”); var predicateBody = Expression.AndAlso(expr.Body, exprAdd.Body); return Expression.Lambda<Func>(predicateBody, param); //Tried this too //var body = Expression.AndAlso(expr.Body, exprAdd.Body); //return Expression.Lambda<Func>(body, expr.Parameters[0]); } 我这样用: […]