【发布时间】:2015-06-19 23:29:50
【问题描述】:
问题是关于在一系列元素中获取最大值。
对象类型未知,属性遵循约定<EntityName>_Id。
目前我是这样解决的:
public static int GetMaxId<TEntity>()
{
try
{
var key = typeof(TEntity).Name;
var adapter = (IObjectContextAdapter)MyDbContext;
var objectContext = adapter.ObjectContext;
// 1. we need the container for the conceptual model
var container = objectContext.MetadataWorkspace.GetEntityContainer(
objectContext.DefaultContainerName, System.Data.Entity.Core.Metadata.Edm.DataSpace.CSpace);
// 2. we need the name given to the element set in that conceptual model
var name = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault().Name;
// 3. finally, we can create a basic query for this set
var query = objectContext.CreateQuery<TEntity>("[" + name + "]");
// working with result
var baseEntity = container.BaseEntitySets.Where((s) => s.ElementType.Name.Equals(key)).FirstOrDefault();
var property = baseEntity.ElementType.Members.FirstOrDefault(_property => _property.Name.EndsWith("Id"));
var tmpResult = query.ToList();
var currentMaxID = tmpResult.Max(element =>
{
PropertyInfo pInfo = typeof(TEntity).GetProperty(property.Name);
int value = (int)pInfo.GetValue(element);
return value;
});
return currentMaxID;
}
catch (Exception ex)
{
string exMessage = "GetMaxId.Exception";
EntityModelDataProviderLogger.Fatal(exMessage, ex);
throw;
}
}
有更好/更清洁的方法吗?
我读过关于动态表达式的文章,但对我来说不是很清楚。
LINQ expression with generic property 此示例比较日期。就我而言,我“只有一个元素”,我不知道如何构造表达式。
【问题讨论】:
标签: c# linq entity-framework generics