Tag: iqueryable

使用WCF的IQueryable问题

我有一个非常简单的WCF服务方法,它返回一个IQueryable,仅用于测试。 也许我在试图了解IQueryable的设计时遇到了什么问题。 我明确计划稍后将其与NHibernate的IQueryable提供程序一起使用。 但是,每当使用返回IQueryable的WCF方法时,我首先遇到某种序列化问题(至少我认为这可能是问题)。 它甚至不适用于简单的字符串。 这是我的代码: public IQueryable GetEquipmentConfigurations() { var returnValue = new List(); returnValue.Add(“test”); return returnValue.AsQueryable(); } 它可能没什么意义,只是为了测试我是否真的使用WCF通过线路获得那些IQueryables。 每当我使用类似SoapUI的客户端调用此方法时,我会收到套接字exception和连接重置,就像我尝试返回未标记为DataContract的内容一样。 但我在这里唯一要做的就是尝试返回一些糟糕的字符串列表。 这有什么问题? 我使用basicHTTPBinding,这是我的设置: 为接口设置OperationContract属性: [OperationContract] IQueryable GetEquipmentConfigurations(); 只返回一个简单的字符串就可以了。 无论如何,我想稍后使用LINQ从IQueryablefunction中获利。 有谁知道这里出了什么问题? 谢谢和干杯, 斯特凡

如何将IQueryable 转换为字符串?

我做一个sql查询,它返回一个字符串 – 服务名称。 这是查询: IQueryable query = from Comp in ServiceGroupdb.ServiceGroupes where (Comp.GroupID == groupID) select Comp.Name; 如何从查询中获取字符串?

适用于匿名类型的IQIeryable

我使用EntityFramework,我正在查询并使用匿名类型返回部分数据。 目前我正在使用IQueryable ,它可以工作,但我想知道这是否是正确的方法,或者是否有其他一些我不知道的返回数据类型。 public IQueryable FindUpcomingEventsCustom(int daysFuture) { DateTime dateTimeNow = DateTime.UtcNow; DateTime dateTimeFuture = dateTimeNow.AddDays(daysFuture); return db.EventCustoms.Where(x => x.DataTimeStart > dateTimeNow & x.DataTimeStart new { y.EventId, y.EventTitle, y.DataTimeStart}); }

从属性名称的字符串创建表达式?

我正在尝试基于一些JSON创建查询,我目前将JSON解析为一组规则,每个规则包含字段的名称,比较的类型(=,> etc)和要比较的值。 我遇到的问题是从规则到IQueryable对象,我猜我需要使用reflection并以某种方式构建表达式树,但我不确定正确的方法…… 假设我有: public class Order : BaseEntity { public int OrderID{ get; set; } } 而我的规则是: public class Rule { public string field { get; set; } public Operations op { get; set; } public string data { get; set; } } 运行它我得到: field = “OrderID” op = “eq” data = “123” 我有方法用签名解析它: […]

LINQ to Entities无法识别方法“方法名称”方法

我遇到了类似的问题: LINQ to Entities无法识别方法’System.String ToString()’方法,并且此方法无法转换为存储表达式 我正在尝试对我的源进行分页,但在我的情况下,我不能将GetPropertyValue的结果放在变量中,因为我需要x来做到这一点: public IEnumerable Paginate(IQueryable source, ref int totalPages, int pageIndex, int pageSize, string sortfield, SortDirection? sortdir) { totalPages = (int)Math.Ceiling(source.Count() / (double)pageSize); if (sortdir == SortDirection.Descending) { return source.OrderByDescending(x => GetPropertyValue(x, sortfield)).Skip(pageIndex * pageSize).Take(pageSize).ToList(); } else { return source.OrderBy(x => GetPropertyValue(x, sortfield)).Skip(pageIndex * pageSize).Take(pageSize).ToList(); } } private static object GetPropertyValue(object […]

确定IQueryable中元素的位置

我有一个IQueryable,它按某种条件排序。 现在我想知道IQueryable中特定元素的位置。 是否有linq表达式来实现。 比如说IQueryable中有10个元素,第6个元素与条件匹配,我想得到数字6。

实现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接收的实体的分离,以防止我的业务层与实际实体联系 […]

存储库/ IQueryable /查询对象

我正在构建一个存储库,我在很多地方看到了2个不在存储库外暴露IQueryable的原因。 1)首先是因为不同的LINQ提供者可能表现不同,这种差异应该包含在存储库中。 2)第二是防止服务级别开发人员修改数据库查询,以免意外导致性能问题。 我想问题2只能通过将所有查询逻辑保留在存储库中并且不允许任何forms的外部查询构建来防止? 但这对我来说似乎有点不切实际。 问题1似乎可以通过使用数据对象模式来解决。 例如public IEnumerable FindBy(Query query) 我的问题是,为什么我不仅仅传递一个lambda表达式,因为它与提供者无关,似乎为我提供了与查询对象相同的function,以及相同的分离级别? 例如public IEnumerable FindBy(Expression<Func> predicate) 有什么理由不这样做吗? 它违反了一些规则吗? 最佳做法? 我应该知道的吗?

C#如何序列化system.linq.expressions?

我正在研究winRT和entity framework(到SQL),它们之间进行通信的层是WCF服务。 在entity framework中,我使用的是Repository Pattern,我有方法: public IQueryable GetBySearch(Expression<Func> search) { return this.Context.Users.Where(search); } 一切正常,但是当我把它添加到WCF [OperationContract] IQueryable GetUserBySearch(Expression<Func> search); 和: public IQueryable GetUserBySearch(Expression<Func> search) { IUser user = new UserRepository(); return user.GetBySearch(search); } 但是Expression不能序列化的问题,因此,WCF无法序列化它。 所以我想inheritance它并使其成为[Serializable]但问题是它是一个密封的类。 有人可以帮我解决问题吗?

结合表达式树

我有以下表达式: public Expression<Func> UserAccessCheckExpression(int userId) where T : class { return x => (IsAdmin || userId == CurrentUserId || userId == 0); } 然后我想将此filter应用于几个集合(IQueryable),如下所示: return tasks .Where(t => t.TaskUsers .Any(x => UserAccessCheckExpression(x.User) && x.SomeBool == true)); 这样做时我收到以下错误: 错误40无法将类型System.Linq.Expressions.Expression<System.Func>隐式转换为bool 我不能使用接口inheritance的解决方法(比如TaskUserinheritance带有int UserId属性的接口(其中T:IHasUserId))因为我想要组合逻辑。