【发布时间】:2019-08-19 08:57:18
【问题描述】:
标题可能有歧义,但让我解释一下。
我正在使用 MongoDb 和 MongoDb 的 c# 驱动程序,我们可以创建一个 FilterDefinition<T> 来创建一个过滤器来获取数据,如下所示:
var Filter = Builders<TestClass>.Filter.Eq(x => x.AnyProperty, Value);
我正在尝试将此代码放入可重用的通用方法中,这样我就不会一次又一次地编写相同的代码。我不会在这里包含整个函数,但在函数内部,我正在尝试执行以下操作:
var Filter = Builders<T>.FIlter.Eq(x => x.AnyProperty, value);
现在的缺点是:
-
T是一个泛型类型,这意味着它没有我正在寻找的属性。因此,我尝试获取T的类型并按名称获取我要查找的属性,如下所示:...FIlter.Eq(x => x.GetType().GetProperty(PropertyName), value)
这会导致异常:
无法确定 x => x.GetType().GetProperty("UserName") 的序列化信息。 // UserName 是属性名
所以,我的问题是,我可以在这里为泛型类型做什么,它相当于 lambda 表达式中的x => x.PropertyName?
更新
忘了说,我确实试过这个:
var Filter = Builders<T>.FIlter.Eq("PropertName", value);
但它不会从数据库中返回结果,因为这样做:
var Filter = Builders<MyClass>.FIlter.Eq("PropertName", value);
我真的很想知道为什么!
更新 2
Filter.Eq的定义如下:
public FilterDefinition<TDocument> Eq<TField>(FieldDefinition<TDocument, TField> field, TField value);
【问题讨论】:
-
这个错误是从哪里来的?是 Mongo 驱动程序还是您的代码,因为如果它是您的代码,那么它可能的修复并且会更复杂的是 Mongo 驱动程序导致它
-
还有
Filter.Eq的定义是什么,它期望什么样的对象,我想,它是一个对象类型,可以接受任何属性 -
我假设这不起作用,因为驱动程序试图将其转换为 C# 以外的其他查询。使用
GetType当然是行不通的。这与 EntityFramework 相同。如果您在查询中有 .net 逻辑,则无法将其转换为 SQL(或其他),因此您会收到错误消息。这只是一个假设,但对我来说很有意义。x => x.Bla之所以有效,是因为 x 代表一个表,而 Bla 代表一个列,因此它可以轻松地将其转换为用于查询的任何内容。 -
试试
x => x.GetType().GetProperty(PropertyName).GetValue(x),因为它期望比较的值不仅仅是PropertyInfo -
在我的脑海中,Mongo 驱动程序使用反射从 MemberExpression 获取属性名称。
x => x.GetType().GetProperty(PropertyName)不是 MemberExpression,所以这是行不通的。你想解决什么问题?
标签: c# mongodb generics lambda