Tag: deferred execution

entity framework查询的服务器端执行与存储过程相结合

是否可以从ObjectQuery调用StoredProcedure? 基本上我想动态构建一个查询并在服务器端执行它。 您可以将每个查询想象成搜索的一部分,您可以将不同的条件与“和”或“或”组合在一起。 对于像这样创建的ObjectQueries,它工作得很好。 var query1 = from a in objectContext.Articles where a.Name = ‘SOMETHING’ select new ResultType { ArticleId = a.ArticleId, Name = a.Name }; var query2 = from a in objectContext.Articles where a.Name = ‘SOMETHING ELSE’ select new ResultType { ArticleId = a.ArticleId, Name = a.Name }; query1 = query1.Intersect(query2); // or union […]

如何维护LINQ延迟执行?

假设我有一个IQueryable表达式,我想封装它的定义,存储它并重用它,或者稍后将它嵌入到更大的查询中。 例如: IQueryable myQuery = from foo in blah.Foos where foo.Bar == bar select foo; 现在我相信我可以保留myQuery对象并像我描述的那样使用它。 但有些事情我不确定: 如何最好地参数化它? 最初我在方法中定义了这个,然后返回IQueryable作为方法的结果。 这样我就可以将blah和bar定义为方法参数,我猜它每次都会创建一个新的IQueryable 。 这是封装IQueryable逻辑的最佳方法吗? 还有其他方法吗? 如果我的查询解析为标量而不是IQueryable怎么办? 例如,如果我希望此查询完全如所示,但附加.Any() ,只是让我知道是否有任何匹配的结果? 如果我添加(…).Any()然后结果是bool并立即执行,对吧? 有没有办法利用这些Queryable运算符( Any , SindleOrDefault等)而不立即执行? LINQ-to-SQL如何处理这个问题? 编辑:第2部分更多的是试图了解IQueryable.Where(Expression<Func>)与IQueryable.Any(Expression<Func>)之间的限制差异IQueryable.Any(Expression<Func>) 。 在创建要延迟执行的大型查询时,似乎后者并不灵活。 可以附加Where() ,然后可以随后附加其他构造,然后最终执行。 由于Any()返回标量值,因此它听起来会在构建其余查询之前立即执行。

使用LINQ .Select()转换为新类型是TOO慢吗?

目前的项目,突破了这个问题: 客户端存储库: public class ClientRepository { // Members private masterDataContext _db; // Constructor public ClientRepository() { _db = new masterDataContext(); } public IEnumerable GetCorporateClientNames() { return _db.corporate_client_tbs.Select(o => new ClientName { id = o.id, name = o.company_name }).AsEnumerable(); } public IEnumerable GetRetailClientNames() { return _db.retail_client_tbs.Select(o => new ClientName { id = o.id, name = o.name […]

为什么在使用foreach时不执行此LINQ查询?

在LINQ语句中创建新对象时,例如: var list = new List() { “a”, “b”, “c” }; var created = from i in list select new A(); A级看起来像这样: class A { public string Label; } 然后使用foreach循环修改A中的属性: foreach (var c in created) { c.Label = “Set”; } 为什么在访问IEnumerable的对象后未设置值。 例如,以下断言失败: Assert.AreEqual(“Set”, created.ElementAt(2).Label); 我想知道为什么会这样。 我希望foreach语句执行查询,并触发对象的创建。 MSDN文档声明: “查询的执行被推迟,直到在foreach或For Each循环中迭代查询变量” 。 我用.NET 4.5和Mono 3.2.0重现了这种行为。 在访问创建的对象之前在IEnumerable上调用ToList会使这个问题消失。

Linq – 找出延期执行的最快方法是什么?

找出哪些.net框架linq方法(例如.IEnumerable linq方法)使用延迟执行而不是使用延迟执行实现的最快方法是什么。 在编码很多次的时候,我想知道这个是否会以正确的方式执行。 找出答案的唯一方法是访问MSDN文档以确保。 会不会有更快的方式,任何目录,网络上的任何列表,任何备忘单,你可以分享的任何其他技巧? 如果是,请这样做。 这将有助于许多linq新手(像我一样)减少错误。 唯一的另一个选择是检查文档,直到一个人使用它们足以记住(这对我来说很难,我往往不记得某些地方记录的“任何东西”,可以查找:D)。