Tag: linq

使用LINQ读取Csv

我有这样的csv文件 A, 22, 23, 12 B, 32, 4, 33 C, 34, 3 ,33 我想打印每行的总和和平均值,并跳过第一列。 如何在LINQ中使用Lambda

IEquatable ,IEqualityComparer 之间的差异,以及在自定义对象集合上使用LINQ时覆盖.Equals()?

在比较自定义对象的两个集合时,我在使用Linq的.Except()方法时遇到了一些困难。 我从Object派生了我的类,并为Equals() , GetHashCode()和运算符==和!=实现了覆盖。 我还创建了一个CompareTo()方法。 在我的两个集合中,作为一个调试实验,我从每个列表中取出了第一个项目(这是重复的),并将它们进行比较如下: itemListA[0].Equals(itemListB[0]); // true itemListA[0] == itemListB[0]; // true itemListA[0].CompareTo(itemListB[0]); // 0 在所有三种情况下,结果都是我想要的。 但是,当我使用Linq的Except()方法时, 不会删除重复的项目: List newList = itemListA.Except(itemListB).ToList(); 了解Linq如何进行比较,我发现了各种(冲突的?)方法,我们需要从IEquatable或IEqualityComparer等inheritance。 我很困惑,因为当我从IEquatableinheritance时,我需要提供一个新的Equals()方法,其签名与我已经覆盖的签名不同。 我需要有两个不同签名的方法,还是我不再从Object派生我的类? 我的对象定义(简化)如下所示: public class MyObject : Object { public string Name {get; set;} public DateTime LastUpdate {get; set;} public int CompareTo(MyObject other) { // … } public override bool […]

如何将DataTable转换为类Object

我已经开发了一个应用程序,可以在任何地方返回DataTable。 现在我的客户端想要转换(使用服务堆栈使用某些部分),所以我需要在我的应用程序中返回DTO(对象)。 我不想更改现有的存储过程,甚至不想尽可能多地使用LINQ(我对LINQ并不太了解)。 对于小function,我可以使用Linq没问题。 我的问题是:如何将我的DataTable更改为该类的对象? 示例代码如下 string s = DateTime.Now.ToString(); DataTable dt = new DataTable(); dt.Columns.Add(“id”); dt.Columns.Add(“name”); for (int i = 0; i < 5000000; i++) { DataRow dr = dt.NewRow(); dr["id"] = i.ToString(); dr["name"] = "name" + i.ToString(); dt.Rows.Add(dr); dt.AcceptChanges(); } List clslist = new List(); for (int i = 0; i < dt.Rows.Count; […]

多次使用Include()时,entity framework代码很慢

我一直在调试一些慢速代码,似乎罪魁祸首是下面发布的EF代码。 在稍后阶段评估查询时需要4-5秒。 我试图让它在1秒内运行。 我使用SQL Server Profiler对此进行了测试,似乎执行了一堆SQL脚本。 它还确认SQL Server完成执行需要3-4秒。 我已经阅读了有关使用Include()的其他类似问题,并且在使用它时似乎确实存在性能损失。 我试图将下面的代码分成几个不同的查询,但它并没有太大的区别。 知道我怎么能让下面更快地执行? 目前我正在处理的网络应用程序只是在等待下面的内容时显示一个空的iframe。 如果我无法获得更快的执行时间,我必须将其拆分并部分加载iframe数据或使用其他异步解决方案。 这里的任何想法也将不胜感激! using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { formInstance = context.FormInstanceSet .Includes(x => x.Include(fi => fi.FormDefinition).Include(fd => fd.FormSectionDefinitions).Include(fs => fs.FormStateDefinitionEditableSections)) .Includes(x => x.Include(fi => fi.FormDefinition).Include(fd => fd.FormStateDefinitions)) .Includes(x => x.Include(fi => fi.FormSectionInstances).Include(fs => fs.FormFieldInstances).Include(ff => […]

EntityFramework VS纯Ado.Net

EF是如此广泛使用的员工,但我没有意识到我应该如何使用它。 我用不同的方法在不同的项目上遇到了很多关于ef的问题。 所以有些问题汇集在我脑海里。 答案让我使用纯粹的ado.net和存储过程。 所以问题是: 如何在n层应用程序中处理EF? 例如,我们有一些带有EF的DAL。 我看到很多文章和项目使用存储库,单元工作模式作为EF的某种抽象。 我认为这样的方法会杀死大多数提高开发速度并导致一些事情的好处: 重新映射EF负载导致某些DTO杀死性能(调用一些select来获取表数据 – 第一个循环,第二个循环 – 将结果映射到ef生成的某些复合类型,next – 使用linq过滤映射数据,最后映射它某些DTO)。 完全重新映射到DTO是最大的efs利益之一的杀手; 要么 导致EF(和它的版本 )和应用程序之间的强大凝聚力。 这将是类似于2层应用程序与dal和演示文稿与bll或dal与bll和演示文稿。 我想这不是最好的做法。 除了映射之外,还有与之前的事情相同的加载过程,因此再次出现性能问题。 我们可以尝试使用EF作为DAL而不需要任何抽象。 但我们会以其他方式得到类似的问题。 我应该为每个app \ thread \ atomic操作使用一个上下文吗? 使用方法 – 每个app \ thread一个上下文可能略微提高性能和调用导航属性的可能性,但我们遇到另一个问题 – 更新此上下文并在上下文中增加加载的数据,我也不确定每个app一个dbcontext的并发性线。 使用每个操作的上下文将导致我们将ef结果重新映射到我们的DTO。 所以你看到我们再次回到问题1。 我们可以尝试仅使用EF + SP吗? 我们再次提出以前的问题。 如果不使用大部分function,使用ef的原因是什么? 所以,EF是开始项目的好方法。 当我们几乎没有屏幕和粗暴操作时,它非常方便。 但接下来呢? 所有这些文字都只是未分类的想法。 我知道纯粹的ado.net会带来另一种挑战。 那么,您对此主题有何看法?

PredicateBuilder是如何工作的

Nutshell中的C#有一个名为PredicateBuilder的免费类,它可以在这里逐个构造LINQ谓词。 这是该方法的一个摘录,它为谓词添加了一个新表达式。 有人可以解释一下吗? (我已经看到了这个问题 ,我不想在那里得到一般答案。我正在寻找Expression.Invoke和Expression.Lambda如何构建新表达式的具体解释)。 public static Expression<Func> And (this Expression<Func> expr1, Expression<Func> expr2) { var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); return Expression.Lambda<Func> (Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters); }

通用LINQ查询谓词?

不确定这是否可行,或者我是否正确地表达了我正在寻找的内容,但我在我的库中反复使用以下代码,并希望练习一些DRY。 我根据用户提供的简单搜索字段ala Google查询了一组SQL Server表。 我正在使用LINQ根据搜索字符串中的内容组成最终查询。 我正在寻找一种方法来使用generics并传递lambda函数来创建一个可重用的例程: string[] arrayOfQueryTerms = getsTheArray(); var somequery = from q in dataContext.MyTable select q; if (arrayOfQueryTerms.Length == 1) { somequery = somequery.Where( e => e.FieldName.StartsWith(arrayOfQueryTerms[0])); } else { foreach(string queryTerm in arrayOfQueryTerms) { if (!String.IsNullOrEmpty(queryTerm)) { somequery = somequery .Where( e => e.FieldName.Contains(queryTerm)); } } } 我希望创建一个带签名的generics方法,它看起来像: private IQueryable getQuery( […]

替换表达式正文中的参数名称

我正在尝试基于Specification对象动态构建表达式。 我创建了一个ExpressionHelper类,它有一个私有的表达式,如下所示: private Expression<Func> expression; public ExpressionHelper() { expression = (Expression<Func>)(a => true); } 然后一些简单的方法如下: public void And(Expression<Func> exp); 我正在和And方法的身体挣扎。 我基本上想要从exp删除主体,将所有参数替换为expression的参数,然后将其附加到expression主体的末尾和AndAlso。 我做到了这个: var newBody = Expression.And(expression.Body,exp.Body); expression = expression.Update(newBody, expression.Parameters); 但最终我的表达看起来像这样: { a => e.IsActive && e.IsManaged } 有更简单的方法吗? 或者我怎样才能撕掉那些e并用一个替换它们?

来自Eric Lippert的博客:“不要关闭循环变量”

可能重复: 为什么在lambda表达式中使用迭代变量很糟糕 C# – foreach标识符和闭包 来自Eric Lippert的2010年6月28日报道 : static IEnumerable<IEnumerable> CartesianProduct(this IEnumerable<IEnumerable> sequences) { // base case: IEnumerable<IEnumerable> result = new[] { Enumerable.Empty() }; foreach(var sequence in sequences) { var s = sequence; // don’t close over the loop variable // recursive case: use SelectMany to build the new product out of the old one […]

向entity framework添加自定义属性?

我是第一次使用entity framework,并想知道以下是否可行 – 我已经从DB生成了我的类,并且有一个名为Category的类。 显然它在表中有我的所有字段(ID,CategoryName,SortOrder等..)但我想知道我是否可以添加一个不在表中的自定义属性,但实际上是自定义方法的结果。 我想添加一个名为’CategoryURL’的新属性,它基本上是通过自定义方法运行的’CategoryName’属性,并返回一个带连字符的字符串。 我最初的想法是从生成的Category类inheritance并在里面创建这样的东西? public string CategoryURL { get{ return MyCustomMethod(this.CategoryName) } } 这是正确的方法吗? ‘this.CategoryName’会像我认为的那样工作吗? 基本上最终的结果是当我返回一个’Category’列表时,我希望它成为类的一部分,所以我可以在foreach循环中使用它。 希望这有道理吗?