可以使动态LINQ与实体复杂类型兼容吗

本文关键字:类型 复杂 实体 动态 LINQ 可以使 | 更新日期: 2023-09-27 18:28:39

我想用System.Linq.Dynamic动态查询一个对象。

 var selectData = (from i in data 
                      select i).AsQueryable().Where("Name = @0","Bob1");//This works fine with a non-entity object

我知道我们不能投影到映射的实体上。我相信这就是这个代码失败的原因

        foreach (var item in rawQuery.ObsDataResultList)
        {
            var propertyData = (from i in item
                                select i).AsQueryable().Where("PropertyName = @0", "blah");
        }//item is a Entity Complex Type

错误

找不到的查询模式的实现源类型"ClassLibrary1.Model.bhcs_ObsData_2_Result"。"Select"不是建立

考虑到我需要在运行时指定PropertyName,我看不出有任何方法可以使用匿名类型或DTO进行项目。

在这一点上,我不需要保留任何实体功能,我只需要数据。将数据复制到可查询的东西上是一个有效的解决方案。那么,是否可以使用动态LINQ查询实体框架呢?

这是实体类标题(我试图查询的东西,也就是项对象)

[EdmComplexTypeAttribute(NamespaceName="MyDbModel", Name="blah_myQuery_2_Result")]
[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class blah_myQuery_2_Result : ComplexObject
{

可以使动态LINQ与实体复杂类型兼容吗

首先,让我澄清一下,System.Linq.Dynamic不是一个成熟的Microsoft产品。这只是我们不久前发布的一个示例,我们没有彻底测试不同的LINQ实现以正确使用它。如果您正在为EF ObjectContext API寻找一种完全支持的基于文本的查询语言,您应该看看Entity SQL。

除此之外,如果您想使用System.Linq.Dynamic,并且您可以对自己进行测试,确保不会遇到任何阻碍应用程序工作的问题,那么我会尽力看看我是否能提供帮助。我需要更多的信息,因为我不确定我是否理解您代码片段中的所有内容。

首先,我想了解,在你的第一个例子中,什么是"数据",它来自哪里?在您的第二个片段中,什么是"rawQuery",它来自哪里?Beddies,什么是rawQuery.DataResultList,什么是rawQuery.ObsDataResultList?

同样关于第二个代码段,您似乎正试图在一个实际上不是查询类型的对象上使用查询运算符进行组合(尽管这并不能解释您遇到的错误,因为您正在调用AsQueryable,编译器之前应该抱怨bhcs_ObsData_2_Result既不是IEnumerable,也不是非通用IEnumeraable)。

在你提出的答案中,你说你尝试过ObjectResult,这似乎有帮助。请注意,ObjectResult不是查询对象,因此它不允许您生成发送到服务器的查询。换句话说,应用于ObjectResult的任何查询运算符都将在内存中进行计算,如果不记住这一点,在应用任何筛选之前,您可能会将该表中的所有数据带入内存。

直接查询ObjectResult<blah_myQuery_2_Result>而不是项blah_myQuery_2_Result。例如

var result = (from i in rawQuery.DataResultList
                          select i).AsQueryable().Where("CreatedDTM > @0", DateTime.Now.Subtract(new TimeSpan(30, 0, 0, 0)));