【发布时间】:2014-08-05 22:04:41
【问题描述】:
我需要能够通过使用单个 Linq 查询匹配属性名称和值来将对象与记录匹配。我不明白为什么这不可能,但我无法弄清楚如何使这项工作。现在我可以使用循环来完成,但这很慢。
剧情如下:
我设置了表来存储任何给定实体的记录,方法是将它们的主键放入具有键的属性名称和值的关联表中。
如果我在运行时有一个随机对象,我需要能够检查该对象的副本是否存在于数据库中,方法是检查对象是否具有与记录中记录的所有键匹配的属性名称数据库(这意味着它们将是相同类型的对象),然后检查每个键的值是否匹配,给我相同的记录。
这是我使用循环使其工作的方法(稍微简化了一点):
public IQueryable<ResultDataType> MatchingRecordFor(object entity)
{
var result = Enumerable.Empty<ResultDataType>();
var records = _context.DataBaseRecords
var entityType = entity.GetType();
var properties = entityType.GetProperties().Where(p => p.PropertyType.Namespace == "System");
foreach (var property in properties)
{
var name = property.Name;
var value = property.GetValue(entity);
if (value != null)
{
var matchingRecords = records.Where(c => c.DataBaseRecordKeys.Any(k => k.DataBaseRecordKeyName == name && k.DataBaseRecordValue == value.ToString()));
if (matchingRecords.Count() > 0)
{
records = matchingRecords;
}
}
}
result = (from c in records
from p in c.DataBaseRecordProperties
select new ResultDataType()
{
ResultDataTypeId = c.ResultDataTypeID,
SubmitDate = c.SubmitDate,
SubmitUserId = c.SubmitUserId,
PropertyName = p.PropertyName
});
return result.AsQueryable();
}
最后一条语句将与数据库记录相关的属性表与所有属性的信息连接起来。
这对于单条记录来说已经足够好了,但我想摆脱那个循环,这样我就可以加快处理多条记录的速度。
【问题讨论】:
-
你能把类型存储在表中吗?这样,您就不必调查属性,因为您已经知道表中所有内容的类型。
-
已经完成了。问题在于,在某些情况下,我们需要将视图模型或 DTO 与 EF 实体进行比较,因此属性都相同但类型会不同。
-
抱歉,我想我没有说清楚。我的意思是“类型的完全限定名称”中的类型,而不是“类型的实例”中的类型。如果您已经知道数据库中的哪些属性与
System.a.b.c的实例相关,那么您只需比较这些属性的值,而不必检查每个属性以查看传入的对象是否包含该属性。 -
对,但在某些情况下,我们会将 system.a.b.c 与 System.a.d.f 进行比较
标签: c# linq entity-framework key-value