Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有实体类型属性的情况下创建动态LINQ语句_C#_Linq_Linq To Sql_Azure_Azure Storage - Fatal编程技术网

C# 在没有实体类型属性的情况下创建动态LINQ语句

C# 在没有实体类型属性的情况下创建动态LINQ语句,c#,linq,linq-to-sql,azure,azure-storage,C#,Linq,Linq To Sql,Azure,Azure Storage,我正在尝试创建一个Linq语句,用于查询实体上作为属性存在的列和实体数据库中不作为列存在的列 例如,我有一个图书实体集合。每本书都有一个ID和Title属性以及数据库中的一个匹配列。但是,假设Book的表还包含一个Author的列字段,MyBook实体没有这个字段 涉及ID和标题的普通查询可能如下所示: Books.Where(b=>b.ID == 123 && b.Title == "Title") 但是,我还想动态地将“和Author='Name'”的等价项添加到上述

我正在尝试创建一个Linq语句,用于查询实体上作为属性存在的列和实体数据库中不作为列存在的列

例如,我有一个图书实体集合。每本书都有一个ID和Title属性以及数据库中的一个匹配列。但是,假设Book的表还包含一个Author的列字段,MyBook实体没有这个字段

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

Books.Where(b=>b.ID == 123 && b.Title == "Title")
但是,我还想动态地将“和Author='Name'”的等价项添加到上述查询中。Book对象上不存在Author属性

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

这可能有助于解释为什么我需要知道我正在使用Azure表存储,并且我已经覆盖了将书本实体转换为Azure中存储的XML的序列化

编辑-

我尝试过使用动态Linq库,但它不起作用

Books.Where(b=>b.ID == 123 && b.Title == "Title").Where("Author = @0", "SomeName").ToList();
抛出: System.Linq.Dynamic.ParseException:类型“Book”中不存在属性或字段“Author”

而且


我知道如何使用书籍。AddQueryOption($filter”,“Author eq'SomeName')在单独使用时有效。但是我不知道如何将AddQueryOption与现有的Where语句一起使用。

请查看动态Linq


如果不向书本添加作者,您必须传递另一个带有作者的对象:

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");
公共类BookEx:Book{
公共字符串作者{get;set;}
}
Books.Cast();

这在LINQ中是不可能的

请尝试以下代码:

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;
}
公共静态IQueryable强制转换(此IQueryable源,字符串类型)
{
开关(类型)
{
案例“tofidacollection.Service.toforienty.Obj”:
返回source.Cast();
}
返回源;
}

我尝试了这一点,但由于某种原因,库正在尝试检查实体是否确实包含该属性。我假设您希望在字段确实存在的某个时间点执行查询。我错过什么了吗?在将该字段放入SQL语句中执行之前,请检查该字段是否存在。不,该属性将永远不存在于Book对象上。我想将生成的查询发送到数据库并获取数据。我会处理中间的一切。我知道有一个名为“author”的列,查询将成功。使用我上面提到的AddQueryOption怎么样?