动态对象,可持久保存到 Azure 并可通过 Dynamic Linq 查询
Posted
技术标签:
【中文标题】动态对象,可持久保存到 Azure 并可通过 Dynamic Linq 查询【英文标题】:Dynamic object, persistable to Azure and Querable by Dynamic Linq 【发布时间】:2012-08-05 11:21:38 【问题描述】:我想要做的是创建一个动态联系人列表。 我正在使用 Azure SQL 存储来保存我的数据和 EF。
类型化的基类“Contact”拥有诸如 Id、Name、Phone 等属性 和一个 "Profile" 类,该类具有诸如 ContactId、PropName、PropVal 之类的属性,可以存储无限数量的联系人属性(例如性别、地址、年龄等)。
所以现在,这行得通:
var cts = db.Contacts
.Where(p => p.ContactProfile.Any(pr => pr.PropertyName == "Sex" && pr.ValueString == "F")
&& p.ContactProfile.Any(pr => pr.PropertyName == "City" && pr.ValueString == "Kaunas"));
我希望实现的是创建一个动态 POCO 类,该类将映射到所描述的 EF 结构,并启用使用 Linq 或 (*Dynamic Linq) 查询这些动态属性。 我设法实现的是使用动态类的“Expando”实现创建动态类。
所以我可以像这样将 EF 模型映射到 Expando
var contact = db.Contacts.First();
dynamic dynContact = new Expando();
dynContact["Sex"] = db.ContactProfiles.First(p => p.Contact.Id == contact.Id && p.PropertyName == "Sex").ValueString;
dynContact.City = db.ContactProfiles.First(p => p.Contact.Id == contact.Id && p.PropertyName == "City").ValueString;
我不知道如何做到这一点: (所以它会产生与第一个 Linq 查询相同的 SQL 查询)
DynamicContact.Where(p=>p["Sex"] = "F" && p.City = "NY")
【问题讨论】:
我怀疑你最终想要的是这样的 var cts = db.Contacts .Where(p => p.Sex == "F") && p.City == "Kaunas") ;这将是一个非常重要的实现,并且需要构建一个 LINQ 提供程序并转换为正确的底层 SQL。此链接可能会有所帮助。 blogs.msdn.com/b/mattwar/archive/2008/11/18/linq-links.aspx 是的,我几乎得出相同的结论,QueryProvider 就是这个问题的答案。这将拦截查询,并根据需要对其进行转换。我认为 Linq-to-Entities 基本上做同样的事情。 好吧,到目前为止,我们倾向于一种“动态 SQL proc”解决方案,它根据传入的一些参数值在内部构建一个查询。似乎 CTE 查询比EXIST,在这种情况下,性能是一个因素.. EF 的 LINQ 不支持 CTE 查询太糟糕了:( 【参考方案1】:Rob Connery 在名为Massive 的项目中做了非常相似的事情。它可能会做你想做的事,或者给你拼图中缺失的部分。
【讨论】:
在另一种情况下,这似乎是一个可能的解决方案。以上是关于动态对象,可持久保存到 Azure 并可通过 Dynamic Linq 查询的主要内容,如果未能解决你的问题,请参考以下文章
每日一练 | python--所有可迭代对象均可通过赋值来分解成单独的变量