Tag: linq

从LINQ开始哪本书是好的?

从LINQ开始哪些书是好的。 如果本书可以涵盖从基础知识到中级水平,那将会很有帮助。

实现IQueryable包装器以转换结果对象

更新2013-08-22: 在看了“建立一个IQueryable提供者系列”之后(感谢链接!)我进一步了解了一下。 我相应地更新了代码。 它仍然没有完全工作。 如果我正确理解了教程,则在请求多个元素的情况下调用GetEnumerator (例如,通过对可查询或任何聚合函数的ToList()调用)。 因此,包装器的所有GetEnumerator实现都要在提供程序上调用Execute并传递可查询的表达式。 在另一种情况下,如果只请求一个元素,则直接调用Execute 。 queryable的表达式还反映了它是单个元素还是多个元素。 它是否正确? 不幸的是,现在我在源查询提供程序上调用Execute时得到一个InvalidOperationException,说‘Sequence包含多个元素’ 。 这是什么意思? 我只是传递表达式而没有任何翻译,因为如上所述涉及相同的类型。 代码中IEnumerable的翻译位可能不完整,但是现在我甚至没有达到这一点。 我正在尝试使用单个底层IQueryable作为数据源来实现一个简单的IQueryable包装器,该数据源为每个结果对象调用转换函数。 我认为这将是相对微不足道的,因为包装器必须做的唯一事情就是翻译。 但是我无法让我的实现工作。 请看下面我到目前为止所得到的内容。 对于某些查询,它正在工作,但我在某些时候收到StackOverflowException InvalidOperationException。 我想这是因为我的queryable和我的查询提供程序之间的循环关联。 但我不明白如何正确实现这一点。 在这里我的问题和想法: 1.为什么IQueryable有一个Provider又可以再次返回IQueryable? 这不是要求无休止的递归吗? 2.为什么不能实现IEnumerator? 为什么FirstOrDefault不使用枚举器来获取元素? 当我调试应用程序时GetEnumerator()没有被我的可查询器上的FirstOrDefault()调用。 3.由于在每种情况下都没有使用枚举器,因此调用翻译函数的正确位置在哪里? QueryProvider的Execute-methods似乎是正确的地方。 但是在某些情况下,我仍然需要在枚举器中进行翻译调用吗? 更新:我知道我需要提供自己的IEnumerable实现,提供TranslatingEnumerator并从我的Execute方法返回此枚举。 为了让枚举器GetEnumerator调用Execute (见下文)。 请求枚举器的LINQ代码似乎确保表达式实际返回IEnumerable 。 关于代码的一些附注: 翻译源类型名为TDatabaseEntity ,翻译目标类型名为TBusinessEntity 。 我基本上提供了一个IQueryable,它从基础IQueryable中获取结果对象,并将它们转换为TBusinessEntity 类型 对象 。 我知道表达式也需要翻译。 但是我把它放在一边,因为在我的实际应用程序中,我使用相同类型的TBusinessEntity和TDatabaseEntity,因此Expression可以直接传递。 尽管属性相同,但结果对象仍然需要转换为其他实例。 更新:我的翻译层已经在我的应用程序中工作,并且还负责相关实体。 它只是’实现一个IQueryable包装’的东西,我坚持。 我担心整个实现都是错误的 – 代码中的TODO只是我自己的注释。 背景:我在我的数据访问层中实现了自己从DbContext接收的实体的分离,以防止我的业务层与实际实体联系 […]

Group by,Count和Lambda Expression

我正在尝试翻译以下查询: SELECT STATE, COUNT(*) FROM MYTABLE GROUP BY STATE; 进入lambda表达式。 我正在使用C#和EntityFramework,但似乎我无法使其工作。 到目前为止,这是我在我的存储库中的内容: public IEnumerable PorcentajeState(Guid id) { return _context.Sates.Where(a => a.Id == id) .GroupBy(a => a.State) .Select(n => new { n.StateId , n.Count() }); } 当然它没有编译,我在谷歌搜索2小时后迷路了。 请你帮助我好吗? 提前致谢

用于RavenDB的多个Contains / Any的Linq查询

我有一个包含“标签”列表的文档类。 就像是: class Item { string Name { get; set; } List Tags {get; set;} } 现在我想为RavenDB创建一个查询,它将所有按标签列表过滤的项目交给我。 使用entity framework时,我设法通过以下方式执行此操作: var query = GetQueryable(); foreach (var tag in tags) { query = query.Where(i => i.Tags.Contains(tag)); } 但是,这似乎不适用于RavenDB,很可能因为不支持Contains ..我也尝试使用Any重写它,( Where(i => i.Tags.Any(t=>t == tag)) )但这给了我一个奇怪的例外: Unable to cast object of type ‘System.Linq.Expressions.PrimitiveParameterExpression`1[System.String]’ to type ‘System.Linq.Expressions.MemberExpression 有什么好主意吗? 我这样做完全错了吗?

C#范例:对列表的副作用

我试图进一步了解副作用以及如何控制和应用它们。 在下面的航class列表中,我想设置满足条件的每个航class的属性: IEnumerable fResults = getResultsFromProvider(); //Set all non-stop flights description fResults.Where(flight => flight.NonStop) .Select(flight => flight.Description = “Fly Direct!”); 在这个表达式中,我对我的列表有副作用。 从我有限的知识,我知道前。 “LINQ仅用于查询 ”和“列表中只有少数操作, 分配或设置值不是其中之一”,“列表应该是不可变的”。 上面的LINQ语句有什么问题,应该如何更改? 我在哪里可以获得有关上述场景的基本范例的更多信息?

如何在LINQ中实现动态“where”子句?

我希望有一个动态的条件。 在以下示例中: var opportunites = from opp in oppDC.Opportunities join org in oppDC.Organizations on opp.OrganizationID equals org.OrgnizationID where opp.Title.StartsWith(title) select new { opp.OpportunityID, opp.Title, opp.PostedBy, opp.Address1, opp.CreatedDate, org.OrganizationName }; 有时我有Title ,有时候我没有Title 。 而且我想动态地在where子句中添加日期。 例如,像这样的SQL: string whereClause; string SQL = whereClause == string.Empty ? “Select * from someTable” : “Select * from someTable” + whereclause

拆除逗号分隔的字符串,同时删除空格和空条目

我想将逗号分隔的字符串转换为字符串数组,并删除空格和空条目。 例如,给定输入: string valueString = “sam, mike, , ,john , Tom and jerry , “; 预期结果将是以下值(当然,修剪): sam mike john Tom and Jerry 我已经尝试了以下修改值的代码行,但是这无法删除“空”条目: valueString.Split(‘,’).Select(sValue => sValue.Trim()).ToArray(); 什么是最好的方法来修剪输入和清理和清空可能导致过程的条目?

如何遍历XDocument的节点

我试图遍历我的xml文档的节点,以获取每个节点中Ed的值。 我使用Linq首先对XDocument进行排序,然后尝试遍历节点。 我似乎无法找到正确的foreach循环来实现这一目标。 任何帮助表示赞赏。 var doc = XDocument.Load(“files\\config.xml”); var newDoc = new XDocument(new XElement(“Config”, from p in doc.Element(“Config”).Elements(“Profile”) orderby int.Parse(p.Element(“order”).Value) select p)); foreach (XElement xe in newDoc.Nodes()) { MessageBox.Show(xe.Element(“username”).Value); } // XML document Scope Scope 1 … 0000 Scope W2BN [IP] Lobby 1 2 Scope 2 Scope 2 … 0000 Scope W2BN [IP] Lobby 1 […]

System.Linq.Dynamic – 我可以在WHERE语句中使用IN子句

我有动态linq WHERE声明: dataContext.Table.Where(“id = 0 Or id = 1 Or id = 2 Or …”); 我想改变: dataContext.Table.Where(“id IN (0, 1, 2, …)”); 但它不起作用。 我怎样才能获得更好的性能呢?

无法隐式转换类型’System.DateTime?’ 到’System.DateTime’。 存在显式转换

我想转换日期时间? todatetime但我收到此错误: 错误7无法隐式转换类型’System.DateTime?’ 到’System.DateTime’。 存在显式转换 这是我的代码: public string ConvertToPersianToShow(DateTime? datetime) { DateTime dt; string date; dt = datetime; string year = Convert.ToString(persian_date.GetYear(dt)); string month = Convert.ToString(persian_date.GetMonth(dt)); string day = Convert.ToString(persian_date.GetDayOfMonth(dt)); if (month.Length == 1) { month = “0” + Convert.ToString(persian_date.GetMonth(dt)); } if (day.Length == 1) { day = “0” + Convert.ToString(persian_date.GetDayOfMonth(dt)); } //date = Convert.ToString(persian_date.GetYear(dt)) […]