Tag: linq

如何在运行时在IEnumerable 上创建动态选择?

鉴于我有一个IEnumerable ,其中T是任何对象,我如何从中选择一个特定的属性,因为我知道运行时其中一个属性名称的名称是一个字符串? 例如: var externalIEnumerable = DataPassedFromConsumingCode(); // `IEnumerable` string knownPropertyName = “Foo”; var fooSelect = externalIEnumerable.Select(…); 本质上,我显然只是做了externalIEnumerable.Select(x=> x.Foo); ,但我需要在运行时执行此Select ,当我无法控制它最初创建时。 – 答案:根据AlanT的回答,这是我实际做的: public Expression<Func> SelectExpression(string fieldName) { var param = Expression.Parameter(typeof(TItem), “item”); var field = Expression.Property(param, fieldName); return Expression.Lambda<Func>(field, new ParameterExpression[] { param }); } 我把它保存为Expression,因为调用Compile导致IQueryable被枚举,这意味着数据库被不必要地命中。 因此,要使用它,我只需执行以下操作: string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single(); var primaryKeyExpression = […]

无法在LINQ OrderBy中使用属性名进行排序

错误是 LINQ to Entities无法识别方法’System.Object GetValue(System.Object,System.Object [])’方法,并且此方法无法转换为存储表达式。 我的代码是 public static GridResult GetAllUsers(int count, int tblsize,string sortcreteria) { using (UserEntities entity = new UserEntities()) { var data = entity.User_Details.Take(count) .OrderBy(i =>.GetType().GetProperty(sortcreteria).GetValue(i,null)) .Skip(tblsize).ToList(); result.DataSource = data; result.Count = entity.User_Details.Count(); } return result; } 如何使用属性名称作为字符串排序?

以LINQ方式初始化Jagged数组

我有一个二维锯齿状数组(虽然它总是矩形),我使用传统的循环初始化: var myArr = new double[rowCount][]; for (int i = 0; i < rowCount; i++) { myArr[i] = new double[colCount]; } 我想也许一些LINQ函数会在一个语句中给我一个优雅的方法来做到这一点。 但是,我能想出的最接近的是: double[][] myArr = Enumerable.Repeat(new double[colCount], rowCount).ToArray(); 问题是它似乎正在创建一个double[colCount]并为每行分配一个新数组的intsead分配引用。 有没有办法做到这一点,而不是太神秘?

LINQ中查询表达式和方法表达式的区别?

我不知道上述标题的用语是否合适。 就像a和b : var list = Enumerable.Range(0, 100); var a = from l in list where l % 2 == 0 select l; var b = list.Where(l => l % 2 == 0); 我什么时候应该使用它们? 有什么不同吗?

Linq orderby,从具体数字开始,然后返回最低

我有一组数据,我想从一个特定的数字开始重新订购,然后,当达到最高数字时,返回到最低点,然后继续递增。 例如,对于序列(1,2,3,4,5,6),如果4是特定数字,则顺序将变为(4,5,6,1,2,3)。 这对linq&c#有可能吗?

奇怪的LINQexception(索引超出范围)

我有一张桌子,我们会打电话给Users 。 此表具有在SQL Server中定义的单个主键 – autoincrement int ID 。 有时,我对这个表的LINQ查询失败, “Index was outside the range”错误 – 即使是最简单的查询。 查询本身不使用任何索引器。 例如: User = Users.Take(1); 要么 IEnumerable = Users.ToList(); 两个查询都抛出了同样的错误。 使用调试器Visualizer查看生成的查询 – 我在SQL中复制并粘贴查询,它工作正常。 我也点击了可视化工具上的“执行”,它工作正常。 但是,执行代码本身会引发此错误。 我没有在类上实现任何部分方法,所以没有任何事情发生在那里。 如果我重新启动我的调试器,问题就会消失,几个小时之后再次随机地重新调整它。 更重要的是,我在生产中运行的应用程序的错误日志中看到了这个错误。 我在我的应用程序中对我的数据库中的十几个不同的实体进行了大量的LINQ,但我只在与表中的特定实体相关的查询中看到此问题。 一些谷歌搜索表明这个问题可能与我的模型和另一个实体之间指定的错误关系有关,但我与此对象没有任何关系。 它似乎在95%的时间工作,只是其他5%的失败。 我已经从设计器中完全删除了该对象,并从“刷新的”服务器浏览器重新添加了该对象,但这并没有解决问题。 有什么想法在这里发生了什么? 这是完整的错误消息和堆栈跟踪: 指数超出范围。 必须是非负数且小于集合的大小。 参数名称:System.Data.Linq的System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询,QueryInfo queryInfo,IObjectReaderFactory工厂,Object [] parentArgs,Object [] userArgs,ICompiledSubQuery [] subQueries,Object lastResult)的索引System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute中的.SqlClient.SqlProvider.ExecuteAll(Expression query,QueryInfo [] queryInfos,IObjectReaderFactory […]

学习LINQ:QuickSort

今天下午我开始学习LINQ,到目前为止只是在收集LINQ。 我尝试的第一件事就是实现QSort。 现在 – 忽略我可以使用ORDERBY并且这是一个非常愚蠢的qsort实现的事实 – 我想出的是: public class lqsort { public static List QSLinq(List _items) { if (_items.Count <= 1) return _items; int _pivot = _items[0]; List _less = (from _item in _items where _item < _pivot select _item).ToList(); List _same = (from _item in _items where _item == _pivot select _item).ToList(); List _greater […]

哪个更快:单个(谓词)或Where(谓词)。单个()

这个答案引起的讨论让我很好奇。 哪个更快: someEnumerable.Single(predicate); 要么 someEnumerable.Where(predicate).Single(); 毕竟,第一个更短,更简洁,似乎是专门建造的。 甚至ReSharper建议前者: 我在上一篇文章中争论说,它们在function上是相同的,并且应该具有非常相似的运行时。

Linq ToList / ToArray / ToDictionary性能

好吧,我遇到很多情况,IEnumerable是不够的。 但是我不确定上述方法调用的性能。 我真正想问的是: 是ToList / ToArray的性能: 一个O(n)操作,它将IEnumerable复制到一个新的数组/列表? 如果我在列表上调用linq扩展方法,如果我调用ToList则它具有O(1)性能,如果调用ToArray则具有O(n)(如果我的原始列表是数组则相反)? 一些魔法发生了,性能是O(1)? 字典可能是O(n),对吧?

Linq:按年和月分组,并管理空月

我有以下Linq按年分组,然后按月分组。 var changesPerYearAndMonth = list .GroupBy(revision => new { revision.LocalTimeStamp.Year, revision.LocalTimeStamp.Month }) .Select(group => new { GroupCriteria = group.Key, Count = group.Count() }) .OrderBy(x => x.GroupCriteria.Year) .ThenBy(x => x.GroupCriteria.Month); 我目前的输出如下: Year 2005, month 1, count 469 Year 2005, month 5, count 487 Year 2005, month 9, count 452 Year 2006, month 1, count 412 Year […]