1

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

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

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

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:“书”类型中不存在“作者”属性或字段。

还,

我知道使用Books.AddQueryOption("$filter","Author eq 'SomeName'") 单独使用时有效。但我不知道如何将 AddQueryOption 与现有的 Where 语句一起使用。

4

4 回答 4

2

如果不将 Author 添加到 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");
于 2009-10-24T22:40:29.447 回答
1

这对于 LINQ 是不可能的

于 2010-02-19T04:50:21.370 回答
0

看看动态 Linq库。

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

于 2009-10-24T21:14:38.593 回答
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;
}
于 2012-07-18T04:55:29.353 回答