不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式

Posted

技术标签:

【中文标题】不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式【英文标题】:Query expressions over source type 'dynamic' or with a join sequence of type 'dynamic' are not allowed 【发布时间】:2014-05-31 14:29:23 【问题描述】:

我正在动态传递一个实体作为参数。但是,在将 linq 与相同的实体对象一起使用时出现异常。

错误:

private void CallCustomerCodeDynamically(dynamic customerEntities)

    var customerCode= from customer in customerEntities.CustomerInfoes
                   orderby customer.CustomerCode ascending
                   select customer.CustomerCode;
    ddlCustomerCode.DataSource = customerCode;
    ddlCustomerCode.DataBind();

请给我一个解决这个问题的建议。

【问题讨论】:

不要使用动态。说真的,你为什么要使用它? dynamic 有很多有趣的用途。 LINQ 不是其中之一。 我有两个相同的数据库实例,我的代码必须与用户选择的数据库实例执行相同的逻辑。我不想为不同的数据库重复相同目的的逻辑。这就是为什么。 这听起来更像是一个通用基类的案例而不是动态的.. 【参考方案1】:

如前所述,Linq 不能很好地与dynamic 配合使用。 Linq 大量使用扩展方法,这些方法在编译时绑定很多,因此您不能使用dynamic,因为它将所有绑定推迟到运行时。

如果您有两个数据集没有共同的基本类型或接口,但具有相同的实体类型(至少按名称),那么您将需要两个重载。您也许可以重构其中的一部分以提高重用性:

private void CallCustomerCodeDynamically(CustmoerEntities1 customerEntities)

    var customerCode= from customer in customerEntities.CustomerInfoes
                   orderby customer.CustomerCode ascending
                   select customer.CustomerCode;

    BindCodes(customerCode);



private void CallCustomerCodeDynamically(CustmoerEntities2 customerEntities)

    var customerCode= from customer in customerEntities.CustomerInfoes
                   orderby customer.CustomerCode ascending
                   select customer.CustomerCode;

    BindCodes(customerCode);


private void BindCodes(IEnumerable<string> customerCode)

    ddlCustomerCode.DataSource = customerCode;
    ddlCustomerCode.DataBind();

【讨论】:

正如 cmets 中提到的,你最好只为公共成员使用一个公共基类型。 @Servy 当然,这样会更简洁 - 但我怀疑这些是不相关的数据集,只是碰巧在名称上具有相同的类型。

以上是关于不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式的主要内容,如果未能解决你的问题,请参考以下文章

序列化动态类型参数 Protobuf-net

具有动态返回类型的表单输入

动态查询 - Expando/动态对象类型

如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表

使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化

为动态 JSON 创建 C# 模型