Tag: dynamic linq

动态LINQ表达式中的空引用exception

我正在使用Microsoft的Dynamic Linq Library / Sample在列表上进行排序。 例如,我有以下C#代码: myGrid.DataSource=repository.GetWidgetList() .OrderBy(sortField + ” ” + sortDirection).ToList(); 我有一个案例,我的对象与另一个对象有0:1的关系,它有一个可能在网格中显示的属性。 当我们尝试对它进行排序时,只要我的所有小部件都有这个孩子,它就能正常工作。 我们按Child.Name排序。 但是当Child为null时,我们得到null引用exception。 我在这里有一些选项,我知道我可以选择一个匿名类型并绑定到那个,我也可以在父对象上公开Child.Name并通过代码处理它(我不喜欢包含我的对象模型) )。 在一个理想的世界里,我想更新库来处理这种情况。 在我深入研究它之前,我想知道是否有人遇到过这个问题并且已经有解决方案了吗? 编辑 看起来我说得不够好。 我使用的是带有C#样本的Dynamic Linq库 。 这个库添加了一些很好的扩展,让你在lambda表达式中使用字符串所以我的代码实际上是这样的: private void BindGrid(sortField,sortDirection) { this.grid.DataSource=….OrderBy(“MyField ASC”)…. } 当然,那里的字符串被参数替换。 但这允许我们在用户点击网格标题时动态更改排序。 我们没有必要的其他逻辑来处理所有的排列。 我记录下来的解决方案将我的干净方法改为: private void BindGrid() { var sortField=this._sortField; if (sortField==”Child.Name”) { sortField=”iif(Child==null,null,Child.Name)”; } this.grid.DataSource=repository.GetWidgetList() .OrderBy(sortField + ” ” + […]

使用表达式树的动态查询

我有一个表单,用户将从下拉列表中选择以下内容: table_name columnName_to_sort_by columnName_to_search_in 用户应在文本框中输入Search_text 表格应从许多表格中提取数据。 我想避免编写排序并搜索每个表的每个字段。 这就是我想使用表达式树的原因。 我想动态构建查询。 我想编写一个generics方法,它将为select , where和orderby方法生成表达式树,具体取决于用户输入。 我可以使用System.Reflection来获取正在查询的Type (我的所有表都是类型 – 我使用的是LinqToSql)。 我不知道如何形成表达式树。 这是我到目前为止所拥有的: private static List GetSortedData( string sortColumnName) { var type = typeof(T); var property = type.GetProperty(sortColumnName); var parameter = Expression.Parameter(type, “p”); var propertyAccess = Expression.MakeMemberAccess(parameter, property); var orderByExp = Expression.Lambda(propertyAccess, parameter); MethodCallExpression resultExp = Expression.Call(typeof(Queryable), “OrderBy”, new Type[] […]

获取具有条件的子实体的实体对象(使用Dynamic Linq)

这个问题是Dynamic Lambda Expression中的Getting Count()属性的延续 我问过我们是否可以将Count()方法放在动态lambda表达式中。 我可以使用Dynamic Expression API来完成它。 答案由 – xmojmr提供 但是最近我不得不实现一个Dynamic Lambda Expression来获得带有过滤数据的子实体的结果。 细节 : 我有一个父实体与其子实体链接。 现在,当我从父实体获取数据时,它也会返回包含其子数据的数据集合。 根据我之前的要求,我必须计算每个父记录返回的所有子记录。 我用它做了 – ParameterExpression cParam = Expression.Parameter(typeof(CPNDBase), “c”); NewExpression newExp = Expression.New(typeof(DTDataModel)); List bindings = new List(); MemberInfo memberInfo = typeof(DTDataModel).GetMember(“FILE_COUNT”)[0]; Dictionary paramExSymbols = new Dictionary(); paramExSymbols.Add(“c”, cParam); Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, “c.CPNDocs.Count()”, paramExSymbols); MemberBinding memberBinding = […]

如何使用linq动态过滤子集合

我正在尝试过滤用户请求的结果。 例如,您有orders和order details , products是子集合。 当用户想要按产品过滤我因为No property or field ‘PRODUCTS’ exists in type ‘ICollection 1 No property or field ‘PRODUCTS’ exists in type ‘ICollection而收到错误 我正在写这样的查询。 var orders = _uow.Repository() .Query() .Where(“PRODUCTS.HEADING.ToLower().Contains(\”foo\”)”) .Include(“ORDER_DETAILS”) .Include(“ORDER_DETAILS.PRODUCTS”) .ToList(); 所以不可能像这样过滤子集合吗? 或者任何方式过滤? 谢谢。

动态linq中的调用函数

我试图在动态linq select语句中调用一个函数,但我得到错误: No property or field ‘A’ exists in type ‘Tuple2’ 示例代码: void Main() { var a = new Tuple(1,1); var b = new[]{ a }; var q = b.AsQueryable().Select(“A.Test(it.Item1)”); q.Dump(); } public static class A { public static int Test(int i) { return i++; } } 我该如何更改代码才能使其正常工作? 如果我调用内置函数Convert.ToInt32 ,它可以正常工作。 var q = b.AsQueryable().Select(“Convert.ToInt32(it.Item1)”); 另外我如何使用动态linq转换属性? […]

从表达式创建动态Linq select子句

假设我已经定义了以下变量: IQueryable myQueryable; Dictionary<string, Expression<Func>> extraFields; // the dictionary is keyed by a field name 现在,我想将一些动态字段添加到IQueryable中,以便返回IQueryable ,其中ExtendedMyClass定义为: class ExtendedMyClass { public MyClass MyObject {get; set;} public IEnumerable ExtraFieldValues {get; set;} } class StringAndBool { public string FieldName {get; set;} public bool IsTrue {get; set;} } 换句话说,对于extraFields每个值,我想在ExtendedMyClass.ExtraFieldValues有一个值,表示该表达式是否为该行的计算结果为True。 我有一种感觉,这应该在动态的Linq和LinqKit中可行,尽管我之前从未认真对待过。 我也对其他建议持开放态度,特别是如果这可以通过良好的“powershell型Linq”来完成。 我正在使用Linq to Entities,因此查询需要转换为SQL。

动态LINQ直接用户输入,有任何危险吗?

我在ASP.NET MVC应用程序中有一个表,我希望它可以排序(服务器端)并使用AJAX过滤。 我希望它在其他地方使用起来相当容易,并且不想将排序和过滤硬编码到查询表达式中,所以我找到了一种动态构建表达式的方法,我发现最好的方法就是使用Dynamic LINQ 。 来自以下URL的用户输入直接插入到动态Where或OrderBy中。 /Orders?sortby=OrderID&order=desc&CustomerName=Microsoft 这将导致两个表达式: OrderBy(“OrderID descending”) Where(@”CustomerName.Contains(“”Microsoft””)”) 虽然我明白它不会直接在数据库中抛出,并且在这里插入直接SQL不会起作用,因为它无法反映到属性并且它是类型安全的所有,我想知道是否有人比我更有创意无论如何都可以找到一种方法来利用它。 我能想到的一个漏洞是,可以对表中不可见的属性进行排序/过滤,但这并不是有害的,因为它们仍然不会被显示,并且可以通过散列来防止它。 我允许直接用户输入的唯一方法是使用OrderBy和Where。 只是确定,谢谢:)

是否可以使用GPU加速(动态)LINQ查询?

我一直在寻找有关使用GPU加速LINQ查询的可能性的可靠信息。 到目前为止我已经“调查过”的技术: Microsoft Accelerator Cudafy 梵 简而言之,甚至可以对GPU上的对象进行内存中过滤吗? 假设我们有一些对象的列表,我们希望过滤类似的东西: var result = myList.Where(x => x.SomeProperty == SomeValue); 关于这个的任何指针? 提前致谢! UPDATE 我会尝试更具体地说明我想要实现的目标:) 目标是,使用任何技术,能够以绝对最快的方式过滤对象列表(范围从~50 000到〜2 000 000)。 在完成过滤(sum,min,max等)时对数据执行的操作是使用内置的LINQ方法完成的,并且对于我们的应用程序已经足够快,所以这不是问题。 瓶颈是“简单地”过滤数据。 UPDATE 只是想补充一点,我已经测试了大约15个数据库,包括MySQL(检查可能的集群方法/ memcached解决方案),H2,HSQLDB,VelocityDB(目前正在进一步调查),SQLite,MongoDB等,而NONE就足够了过滤数据的速度(当然,NO-sql解决方案不提供像sql那样,但你得到的想法)和/或返回实际数据。 只是总结一下我/我们需要的东西: 一种数据库,能够在不到100毫秒的时间内对200列和大约250 000行的数据进行排序。 我目前有一个带有并行化LINQ的解决方案,它能够(在特定的机器上)在过滤和处理结果时每行只花费纳秒时间! 因此,我们需要在每一行上进行亚纳秒级过滤。 为什么只有内存LINQ能够提供这个? 为什么这不可能? 日志文件中的一些数字: Total tid för 1164 frågor: 2579 这是瑞典语并翻译: Total time for 1164 queries: 2579 这种情况下的查询是这样的查询: WHERE SomeProperty = SomeValue […]

在动态linq查询中调用Regex.IsMatch()

我正在尝试调用Regex.IsMatch()并在动态linq查询中评估返回的结果。 这是我试过的: public static LambdaExpression Parse(SearchQuery query) { string compilableExpression = “Regex.IsMatch(Category.ToLower(), \”\\bSomeCat\\b\”, RegexOptions.Compiled) == true”; ParameterExpression parameter1 = System.Linq.Expressions.Expression.Parameter(typeof(EventListItem)); ParameterExpression parameter2 = System.Linq.Expressions.Expression.Parameter(typeof(Regex)); return System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { parameter1, parameter2 }, null, compilableExpression); } 在这种情况下, Category是EventListItem的属性。 调用ParseLambda()抛出此exception: Unknown identifier ‘Regex’ 。 有没有办法调用该方法? 我遇到了Expression.Call()方法,但我不确定这是否是我正在寻找的。 任何帮助表示赞赏。

动态创建lambdas表达式+ linq + OrderByDescending

如何创建一个动态lambda表达式来传递给我在linq里面的orderby函数中使用? 我基本上想要转换queryResults.OrderByDescending(); 在queryResults.OrderByDescending(myCustomGeneratedLambdaExp); 其中myCustomGeneratedLambdaExp应为包含x => x.name的字符串。 谢谢