获取给定EntityType的导航属性

我使用的是VS2010,EF4.0 。 需要如下function。

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行抛出exception。
有帮助吗?

您可以过滤GetProperties结果以仅获取实现ICollectionIEnumerable 。 但是,您应该记住该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 GetNavigationProperties(Type t) { var navigationProperties = new List(); if (t.BaseType != null && t.Namespace == "System.Data.Entity.DynamicProxies") { t = t.BaseType; } string fkName = t.Name + "Id"; var allProps = new List(); 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方法来检索导航属性而不是使用reflection:

 MetadataWorkspace workspace = ((IObjectContextAdapter)this.Context).ObjectContext.MetadataWorkspace; ObjectItemCollection itemCollection = (ObjectItemCollection)(workspace.GetItemCollection(DataSpace.OSpace)); EntityType entityType = itemCollection.OfType().Single(e => itemCollection.GetClrType(e) == typeof(TEntity)); 

其中this.Context是DbContext类的一个实例。 之后,您可以访问EntityType的NavigationProperties属性。

Linq和entity framework与分组报告

public static string strMessage =“”; public Sc​​hoolEntities dbContext;

  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(); 

}

“它不是你得到的,而是你给的东西让你变得更富有”