我在将应用程序定义的对象列表传递给RIA服务时遇到问题。我收到一个编译错误,说“域操作条目'GetPagedExams'的错误参数'过滤器'必须是预定义的可序列化类型之一。”
以下是DomainService中的查询:
[Query]
public IQueryable<ExamEntity> GetPagedExams(int first, int pageSize, List<FilterOptions> filters, List<string> sortDescriptions)
{
return Context.Exams.GetPagedExams(first, pageSize, filters, sortDescriptions).Data.AsQueryable();
}
过滤器选项类定义为:
[DataContract]
[Serializable]
public class FilterOptions
{
public enum FilterAction
{
Equals,
NotEquals,
LessThan,
LessThanOrEquals,
GreaterThan,
GreaterThanOrEquals,
Like,
NotLike,
IsNull,
IsNotNull
}
[DataMember]
[Key]
public string FieldName
{ get; set; }
[DataMember]
public FilterAction FilterOp
{ get; set; }
[DataMember]
public object FieldValue
{ get; set; }
}
添加DataContract和DataMember属性没有帮助。
我需要传递可变数量的过滤约束,这些约束将作为服务器端SQL查询的一部分进行组装,因此对象列表几乎是必需的。 (是的,它是下面的原始SQL,数据库可以是SQL Server或Oracle。所以我不能使用LINQ,而且Silverlight客户端无法知道我正在使用哪个数据库。)
有什么建议吗?我正要尝试从客户端传递XML序列化,并在服务器上重新保湿。这真的不是我的首选....
当我为过滤器而不是集合传递单个字符串时,这是一个有效的查询。所以我知道问题严格来说就是自定义集合。
答案 0 :(得分:0)
这似乎是RIA服务的当前限制。看看MSDN forum
编辑:在另一个项目中再次遇到此问题。一个不那么好的解决方法是使用[Invoke]
方法,它可以获取List参数并返回IEnumerable<X>
,但RIA服务不会发回X的导航属性。 / p>