我正在为.NET Core 2.1中的mongodb创建数据库摘要。 为此,我使用了Nu-Get的mongo驱动程序。
现在,我正在研究一种简单的通用扩展方法,以类似于关系数据库的其他数据库抽象那样的方式包含引用的对象。
以下示例显示了我如何计划获取客户集合并包括相关的工作机会:
//get the customer collection and include the related job offers
var result = Database.Customers.Find(x => x.Id != null).Include(x => x.JobOffers);
这是Include扩展方法的代码:
public static IList<T> Include<T>(this IFindFluent<T, T> result, Expression<Func<T, object>> filter)
{
var propertyName = filter.Body.ToString().Split(".")[1];
var idFieldName = typeof(T).Name.Substring(0, typeof(T).Name.Length) + "Id";
var list = new List<T>();
foreach (dynamic item in result.ToList())
{
try
{
var type = item.GetType().GetProperty(propertyName).PropertyType.GenericTypeArguments[0];
var builder = Builders<JobOffer>.Filter;
var queryFilter = builder.Eq(idFieldName, (string)item.Id);
var prop = item.GetType().GetProperty(propertyName);
var relatedItems = _database.GetCollection<JobOffer>(propertyName).Find(queryFilter).ToList();
prop.SetValue(item, relatedItems);
}
catch (Exception e)
{
}
list.Add(item);
}
return list;
}
到目前为止,它仍然有效,但是现在它仅适用于JobOffers类型的对象,并且应该适用于任何类型的对象。
所以我的问题是:在try {}部分中,有一个变量类型,其中所需的类存储为Type。
如何在尖括号中使用此类型?我想做这样的事情:
var type = item.GetType().GetProperty(propertyName).PropertyType.GenericTypeArguments[0];
var builder = Builders<type>.Filter;
var relatedItems = _database.GetCollection<type>(propertyName).Find(queryFilter).ToList();
但是我得到了一个错误:type是一个变量,但是被用作类型。
我该如何解决?