我正在尝试创建一个Linq语句,该语句查询我的实体上存在的列作为属性,以及那些不作为实体的数据库中的列存在的列。
例如,我有一组Book实体。每本书都有一个ID和Title属性以及数据库中的匹配列。但是,假设Book的表格还包含作者的列字段,而我的图书实体没有此字段。
涉及ID和标题的普通查询可能如下所示:
Books.Where(b=>b.ID == 123 && b.Title == "Title")
但是,我还想在上面的查询中动态添加等效的“ AND Author ='Name'”。 Book对象上不存在Author属性。
它们应包含的额外字段和值实际上可以在字典中使用。因此,我需要在查询中动态添加多个 AND [FieldName] ='[Value]'条件。
这可能有助于解释为什么我需要知道我正在使用Azure表存储,并且我已经覆盖了将Book实体转换为存储在Azure中的XML的序列化。
编辑 -
我尝试过使用Dynamic Linq库,但它不起作用。
Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();
抛出: System.Linq.Dynamic.ParseException:“Book”类型中不存在属性或字段“Author”。
此外,
我知道使用 Books.AddQueryOption(“$ filter”,“作者eq'SomeName'”)在单独使用时有效。但我不知道如何使用AddQueryOption以及现有的Where语句。
答案 0 :(得分:2)
如果不将Book添加到Book,您可能需要传递另一个包含Author的对象:
var x = new { Author="SomeName" };
Books.Where(b=>b.Id == 1 && b.Title == "Alpha").Where("@1.Author == @0", "SomeName", x);
或者从Book继承并为此目的添加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");
答案 1 :(得分:1)
LINQ
无法做到这一点答案 2 :(得分:0)
答案 3 :(得分: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;
}