繁体   English   中英

如何在子查询中将字符串变量设置为属性

[英]how to set string variable as property in subquery

我有以下对象:

var authors1 = new List<Author>() {
    new Author{ FirstName = "William", LastName = "Smith" },
    new Author{ FirstName = "Fred", LastName = "Jones" }
};

var authors2 = new List<Author>() {
    new Author{ FirstName = "Brian", LastName = "Brains" },
    new Author{ FirstName = "Billy", LastName = "TheKid" }
};

var books = new List<Book>() {
    new Book{ Title = "JAVA", Description = "Description Java", Authors = authors1 },
    new Book{ Title = "PHP", Description = "Description PHP", Authors = authors2 },
};

我想按作者创建子查询过滤。 我知道我可以做这样的事情:

IEnumerable<Book> list = books.Where(x => x.Authors.Where(j => j.FirstName == "William").Any());

但我想将authors 属性用作字符串var。

var entity = "Authors"
IEnumerable<Book> list = books.Where(x => x[entity].Where(j => j.FirstName == "William").Any());

这是行不通的。

我不明白你为什么要这样做......但这是你可以通过反射达到你想要的一种方法:

public bool HasAuthorWithName(Book book, string authName)
{
    // Retrieve list of class' properties
    var p = book.GetType().GetProperties();
        
    // Get list of authors prop by name             
    var entity = "Authors";
    var lstAuthors = p.First(x => x.Name == entity).GetValue(book, null) as List<Author>;
        
    // Filter by author's name
    if (lstAuthors != null && lstAuthors.Any())
    {
        return lstAuthors.Any(j => j.FirstName == authName);
    }
    
    return false;
}

现在你可以调用这个方法:

IEnumerable<Book> list = books.Where(x => HasAuthorWithName(x, "William"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM