2009-10-24 25 views
1

我试图创建一个Linq语句,它查询作为属性的实体上存在的两个列,以及那些不存在作为实体的数据库中的列的列。创建动态LINQ语句而不具有实体类型属性

例如,我有一个Book实体的集合。每本书都有一个ID和Title属性以及数据库中的匹配列。但是,可以说Book的表格还包含作者的列字段,而我的Book实体没有此字段。

涉及ID和标题看起来可能是这样一个正常的查询:

Books.Where(b=>b.ID == 123 && b.Title == "Title") 

但是,我想也是动态的“和作者=‘名称’相当于”添加到上面查询以及。 Book对象上不存在Author属性。

额外的字段和它们应该包含的值实际上将在字典中可用。所以我需要动态添加多个和[FieldName] ='[Value]'条件到查询。

它可能有助于解释为什么我需要此知道我正在使用Azure表存储,并且我重写了将Book实体转换为存储在Azure中的XML中的序列化。

编辑 -

我使用动态的LINQ库尝试,但它不工作。

Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList(); 

抛出: System.Linq.Dynamic.ParseException:无属性或字段 '作者' 型 '书' 的存在。

此外,

我知道使用Books.AddQueryOption( “$过滤器”, “作者EQ 'SomeName'”)单独使用时作品。但我不知道如何使用AddQueryOption和现有的Where语句。

回答

0
+0

我想这一点,但库试图检查实体实际上包含了财产的某些原因。 – Vyrotek 2009-10-24 21:52:38

+0

我假设您希望在字段确实存在的某个时间点执行查询。我错过了什么吗?在将其放入SQL语句中执行之前,检查该字段是否存在。 – 2009-10-24 21:53:48

+0

不,属性将永远不会存在于Book对象上。我想将生成的查询发送到数据库并获取数据。我会处理之间的一切。我知道有一个名为'author'的列,并且查询会成功。如上所述,使用AddQueryOption怎么样? – Vyrotek 2009-10-24 22:00:33

2

无需添加行为,与书,你要么必须通过与作者的另一对象是:

var x = new { Author="SomeName" }; 
    Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x); 

或者从图书继承并添加一个Author属性只是为了这个目的:

public class BookEx : Book { 
    public string Author { get; set; } 
} 

Books.Cast<BookEx>().Where(b=>b.Id == 1 && b.Title== "Alpha").Where("Author == @0", "SomeName"); 
0

试试下面的代码:

var result = _tofiObjectList.Where(o => o.GetType() == mainObjType) 
    .AsQueryable().Cast(relation.MainObject.EntityType).Where(relation.MainObject.Filter); 

这是IQueryable类型的扩展方法:

public static IQueryable Cast(this IQueryable source, string type) 
{ 
    switch (type) 
    { 
     case "TofiDataCollection.Service.TofiEntity.Obj": 
      return source.Cast<Obj>(); 
    } 
    return source; 
} 
相关问题