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

时间:2012-03-21 19:46:31

标签: c# entity-framework-4 dynamic-linq

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

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

know我们无法投射到映射的实体上。我相信这就是这段代码失败的原因

        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'。 '选择'不是   找到。

鉴于我需要在运行时指定PropertyName,我没有看到任何使用匿名类型或DTO进行投影的方法。

此时我不需要保留任何实体功能,我只需要数据。将数据复制到可查询的内容是一种有效的解决方案。那么,是否可以使用动态LINQ查询实体框架?

这是实体类头(我正在尝试查询的东西,也就是项目对象)

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

2 个答案:

答案 0 :(得分:2)

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

除此之外,如果你想使用System.Linq.Dynamic并且你可以自己测试你没有点击阻止你的应用程序工作的任何东西,那么我会试着看看我是否能提供帮助。我将需要其他信息,因为我不确定我是否理解您的代码段中的所有内容。

首先,我想了解一下,在您的第一个示例中,什么是“数据”以及它来自何处?在你的第二个片段中,什么是“rawQuery”,它来自哪里? Besdies,什么是rawQuery.DataResultList,什么是rawQuery.ObsDataResultList?

另外关于你的第二个片段,似乎你试图在一个实际上不是查询类型的对象之上构造查询运算符(尽管这并不能解释你在调用时得到的错误)在ashable之前,编译器应该抱怨bhcs_ObsData_2_Result不是IEnumerable,也不是非通用的IEnumerable)。

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

答案 1 :(得分:0)

直接查询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)));