不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式
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 当然,这样会更简洁 - 但我怀疑这些是不相关的数据集,只是碰巧在名称上具有相同的类型。以上是关于不允许使用源类型“动态”或具有“动态”类型连接序列的查询表达式的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有任何视图或任何其他表类型的情况下在 oracle 中创建具有动态列名和动态数据类型的动态表