我正在尝试创建一个Linq语句,该语句查询我的实体上存在的列作为属性,以及那些不作为实体的数据库中的列存在的列。

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

涉及ID和标题的普通查询可能如下所示:

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

但是,我还要动态添加相当于“ AND Author ='姓名'"以上查询也是如此。 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"," Author eq'TomeName'")在单独使用时有效。但我不知道如何使用AddQueryOption以及现有的Where语句。

有帮助吗?

解决方案 2

LINQ

无法做到这一点

其他提示

如果不将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");

请尝试以下代码:

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;
}
scroll top