Получить свойства навигации данного EntityType
Я использую VS2010, В EF4.0. Функция потребности как следующее.
private string[] GetNaviProps(Type entityType)//eg typeof(Employee)
{
NorthwindEntities en = new NorthwindEntities();
//here I return all Properties only for example
return entityType.GetProperties().Select(p=>p.Name).ToArray();
//should return Orders,Territories...
}
Я проверил этой, но IObjectContextAdapter кажется чем-то в EF6.0 и .net4.5. Я попытался заменить его как
var workspace = en.MetadataWorkspace;
таким образом, он может компилироваться, но исключение бросает на 3-ю строку.
Любой помочь?
4 ответов
вы можете отфильтровать GetProperties результаты, чтобы получить только те, которые реализуют ICollection или IEnumerable. Однако, вы должны помнить, что string осуществляет IEnumerable, поэтому вы должны добавить дополнительную проверку, чтобы не возвращать string свойства.
return entityType.GetProperties()
.Where(p => typeof(IEnumerable).IsAssignableFrom(p.PropertyType) && p.PropertyType != string)
.Select(p => p.Name)
.ToArray();
обновление
вы можете изменить вы Where предикат для сравнения пространств имен, а также. Он также возвращает свойства навигации 1:1:
private static string[] GetNaviProps(Type entityType)//eg typeof(Employee)
{
return entityType.GetProperties()
.Where(p => (typeof(IEnumerable).IsAssignableFrom(p.PropertyType) && p.PropertyType != typeof(string)) || p.PropertyType.Namespace == entityType.Namespace)
.Select(p => p.Name)
.ToArray();
}
на основе этой ответ
private static List<PropertyInfo> GetNavigationProperties(Type t)
{
var navigationProperties = new List<PropertyInfo>();
if (t.BaseType != null && t.Namespace == "System.Data.Entity.DynamicProxies") {
t = t.BaseType;
}
string fkName = t.Name + "Id";
var allProps = new List<PropertyInfo>();
foreach (PropertyInfo p in t.GetProperties()) {
if (p.PropertyType.IsGenericType) {
dynamic GenericTypeDefinition = p.PropertyType.GetGenericTypeDefinition();
if (GenericTypeDefinition == typeof(ObservableCollection<>) || GenericTypeDefinition == typeof(ICollection<>) || GenericTypeDefinition == typeof(IEnumerable<>)) {
allProps.Add(p);
}
}
}
foreach (PropertyInfo prop in allProps) {
// This checks if the other type has a FK Property of this Type.
var type = prop.PropertyType.GetGenericArguments().First();
bool HasOneProperty = type.GetProperties().Any(x => x.Name.Equals(fkName, StringComparison.OrdinalIgnoreCase));
if (HasOneProperty) {
navigationProperties.Add(prop);
}
}
return navigationProperties;
}
Я знаю, что немного опоздал на вечеринку, но вы можете использовать Entity Framework для получения свойств навигации вместо использования отражения:
MetadataWorkspace workspace = ((IObjectContextAdapter)this.Context).ObjectContext.MetadataWorkspace;
ObjectItemCollection itemCollection = (ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace));
EntityType entityType = itemCollection.OfType<EntityType>().Single(e => itemCollection.GetClrType(e) == typeof(TEntity));
где это.Context является экземпляром класса DbContext. После этого можно получить доступ к свойству NavigationProperties EntityType.
LINQ и Entity Framework с группированным отчетом
публичная статическая строка strMessage = ""; DbContext и общественных SchoolEntities;
public string login(string strUsername, string strPassword)
{
dbContext = new SchoolEntities();
var linqQuery = from User in dbContext.People
where User.FirstName == strUsername && User.LastName == strPassword
select User;
if (linqQuery.Count() == 1)
{
strMessage = "Good";
}
else
{
strMessage = "Bad";
}
return strMessage;
}
public Object LoadPersonDetails()
{
dbContext = new SchoolEntities();
var linqQuery = from users in dbContext.People
select users;
return linqQuery;
}
public void InsertPerson(string strLName, string strFName, string strHireDate, string EnrollmentDate)
{
dbContext = new SchoolEntities();
Person NewPerson = dbContext.People.Create();
NewPerson.LastName = strLName;
NewPerson.FirstName = strFName;
NewPerson.HireDate = Convert.ToDateTime(strHireDate);
NewPerson.EnrollmentDate = Convert.ToDateTime(EnrollmentDate);
dbContext.People.Add(NewPerson);
dbContext.SaveChanges();
}
public void DeleteUser(int intPersonID)
{
using (dbContext = new SchoolEntities())
{
Person Person = dbContext.People.Where(c => c.PersonID == intPersonID).FirstOrDefault();
if (Person != null)
{
dbContext.People.Remove(Person);
dbContext.SaveChanges();
}
}
}
public void ModifyPerson(int intPersonID, string strLName, string strFName, string strHireDate, string EnrollmentDate)
{
dbContext = new SchoolEntities();
var UpdatePerson = dbContext.People.FirstOrDefault(s => s.PersonID == intPersonID);
UpdatePerson.LastName = strLName;
UpdatePerson.FirstName = strFName;
UpdatePerson.HireDate = Convert.ToDateTime(strHireDate);
UpdatePerson.EnrollmentDate = Convert.ToDateTime(EnrollmentDate);
dbContext.SaveChanges();
}
private Excel.Application XApp = null; //Creates the Excel Document
private Excel.Workbook XWorkbook = null; //create the workbook in the recently created document
private Excel.Worksheet XWorksheet = null; //allows us to work with current worksheet
//private Excel.Range XWorkSheet_range = null; // allows us to modify cells on the sheet
public void Reports()
{
dbContext = new SchoolEntities();
var linqQuery = (from users in dbContext.StudentGrades
group users by new { users.EnrollmentID, users.CourseID, users.StudentID, users.Grade }
into UserGroup
orderby UserGroup.Key.CourseID ascending
select new { UserGroup.Key.EnrollmentID, UserGroup.Key.CourseID, UserGroup.Key.StudentID, UserGroup.Key.Grade }).ToList();
var RatingAverage = dbContext.StudentGrades.Average(r => r.Grade);
var GradeSum = dbContext.StudentGrades.Sum(r => r.Grade);
/*var linqQuery = (from users in dbContext.StudentGrades
orderby users.CourseID descending
select users).ToList();*/
//Array Motho = linqQuery.ToArray();
var GradeInfo = linqQuery.ToList();
XApp = new Excel.Application();
XApp.Visible = true;
XWorkbook = XApp.Workbooks.Add(1);
XWorksheet = (Excel.Worksheet)XWorkbook.Sheets[1];
//Create column headers
XWorksheet.Cells[1, 2] = "Standard Student Grades Report";
XWorksheet.Cells[2, 1] = "EnrollmentID";
XWorksheet.Cells[2, 2] = "CourseID";
XWorksheet.Cells[2, 3] = "StudentID";
XWorksheet.Cells[2, 4] = "Grade";
int row = 3;
foreach (var Mothos in linqQuery)
{
XWorksheet.Cells[row, 1] = Mothos.EnrollmentID.ToString();
XWorksheet.Cells[row, 2] = Mothos.CourseID.ToString();
XWorksheet.Cells[row, 3] = Mothos.StudentID.ToString();
XWorksheet.Cells[row, 4] = Mothos.Grade.ToString();
row++;
}
int rows = linqQuery.Count();
XWorksheet.Cells[rows + 4, 3] = "Grades Average";
XWorksheet.Cells[rows + 4, 4] = RatingAverage.Value.ToString();
XWorksheet.Cells[rows + 5, 3] = "Grades Sum";
XWorksheet.Cells[rows + 5, 4] = GradeSum.Value.ToString();
XWorksheet.Rows.Columns.AutoFit();
}
public void GroupedExcel()
{
dbContext = new SchoolEntities();
var linqQuery = from Grading in dbContext.StudentGrades
orderby Grading.CourseID
select Grading;
var lstGrades = linqQuery.ToList();
Excel.Application xlApp = new Excel.Application();
xlApp.Visible = true;
Excel.Workbook xlBook = xlApp.Workbooks.Add(1);
Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
int GroupTotal = 0;
int GrandTotal = 0;
int ExcelRow = 5;
int intTemp = lstGrades[0].CourseID;
xlSheet.Cells[4, 1] = lstGrades[0].CourseID;
//Create column headers
xlSheet.Cells[1, 1] = "Grouped Student Grades Report";
xlSheet.Cells[3, 1] = "Group header";
xlSheet.Cells[3, 2] = "EnrollmentID";
xlSheet.Cells[3, 3] = "CourseID";
xlSheet.Cells[3, 4] = "StudentID";
xlSheet.Cells[3, 5] = "Grade";
for (int count = 0; count < lstGrades.Count; count++)
{
if (intTemp == lstGrades[count].CourseID)
{
xlSheet.Cells[ExcelRow, 2] = lstGrades[count].EnrollmentID.ToString();
xlSheet.Cells[ExcelRow, 3] = lstGrades[count].CourseID.ToString();
xlSheet.Cells[ExcelRow, 4] = lstGrades[count].StudentID.ToString();
xlSheet.Cells[ExcelRow, 5] = lstGrades[count].Grade.ToString();
ExcelRow++;
GroupTotal++;
GrandTotal++;
}
else
{
xlSheet.Cells[ExcelRow, 5] = "Total for: " + intTemp + " = " + GroupTotal.ToString();
ExcelRow++;
intTemp = lstGrades[count].CourseID;
xlSheet.Cells[ExcelRow, 1] = lstGrades[count].CourseID;
count--;
GroupTotal = 0;
ExcelRow++;
}
}
xlSheet.Cells[ExcelRow, 5] = "Total for: " + intTemp + " = " + GroupTotal.ToString();
ExcelRow++;
xlSheet.Cells[ExcelRow, 5] = "Grand Total = " + GrandTotal.ToString();
xlSheet.Rows.Columns.AutoFit();