당신은 Provider
와 Article
사이에 일대 다 관계를 가지고 모든 Provider
는 0 개 이상의 Articles
을 가지고, 그리고 모든 Article
정확히을 속한 하나 Provider
. 만약 엔티티 프레임 워크에서 올바르게 일대 다 관계를 구성한 경우
는
, 프로 바이더는 많은 Articles
참조를 가져야한다 : 또한
public virtual ICollection<Article> Articles{get; set;}
는 입력 int로서 취하는 함수 Next
을 가지고 클래스 T
의 객체이며, IModel
을 구현하는 클래스입니다. Next
은 다음 요소에 대한 적절한 정의가 있다고 가정하고 Ts의 DbSet에서 다음 요소를 반환합니다.
분명히 다음 함수를 사용하려면이 함수를 사용하여 다음을 얻는 것 Provider
모두가 Articles
이어야합니다.
보다 일반적인 : T가 올바르게 설계된 일대 다 관계가있는 유형이고 T 유형의 객체가있는 경우 첫 번째 ID가 현재 T의 ID보다 높은 T를 원한다. , 모든 ICollections 포함.
나는 단절 작은 함수로이 분할했습니다
- 유형 주어진 T는 ICollection에
- 주어진 DbSet가 DbSet의 모든 요소를 반환하는 함수 구현하는 모든 속성을 반환하는 함수 포함하는 모든 사람들이 주어진 ICollections
및 OrderBy
및 FirstOrDefault
당신의 모든 기사와 현재의 공급자보다 큰 ID를 가진 최초의 공급자를 얻을 수있을 것 같은 기능을 수행합니다.
static class QueryableExtensions
{
// returns true if PropertyInfo implements ICollection<...>
public static bool ImplementsICollection(this PropertyInfo propertyInfo)
{
return propertyInfo.IsGenericType
&& propertyInfo.GetGenericTypeDefinition() == typeof(ICollection<>);
}
// returns all readable & writable PropertyInfos of type T that implement ICollection<...>
public static IEnumerable<PropertyInfo> CollectionProperties<T>()
{
return typeof(T).GetProperties()
.Where(prop => prop.CanRead
&& prop.CanWrite
&& prop.PropertyType.ImplementICollection();
}
// given an IQueryable<T>, adds the Include of all ICollection<...> T has
public static IQueryable<T> IncludeICollection<T>(IQueryable<T> query)
{
var iCollectionProperties = CollectionProperties<T>();
foreach (var collectionProperty in collectionProperties)
{
query = query.Include(prop.Name);
}
return query;
}
// given a IQueryable<T> and a T return the first T in the query with Id higher than T
// for this we need to be sure every T has an IComparable property Id
// so T should implement interface IId (see below)
public T Next<T>(this IQueryable<T> query, T currentItem)
where T : IId // makes sure every T has aproperty Id
{
T nextElement = query
// keep only those DbSet items that have larger Ids:
.Where(item => currentItem.Id < item.Id)
// sort in ascending Id:
.OrderBy(item => item.Id
// keep only the first element of this sorted collection:
.FirstOrDefault();
return T
}
}
내가 그렇지 않으면 다음 ID를 가져올 수 없습니다, 모든 T는 ID를 가지고 있는지 확인해야합니다. 같은 이러한 기능을 한 후 쿼리가 될 것입니다
public Interface IId
{
public int Id {get;}
}
: 아마 당신은 당신의 IModel 해당 인터페이스이이
public static T Next<T>(T currentElement) where T : class, IModel, IId
{
T data;
if (currentElement.Id >= GetLastId<T>())
return currentElement;
using (DatabaseEntities context = new DatabaseEntities())
{
return context.Set<T>().Next(currentElement);
}
}
귀하의 질문에 대답하지,하지만 난 당신의 다음 요소를 얻기 위해 '아이디 + 1'을 사용하여 생각 위험 할 수 있습니다. 테이블의 행이 삭제되면 예외가 throw됩니다. – DavidG
답변으로,이 방법에 포함 목록을 전달할 수 있습니까? – DavidG
@DavidG 당신은 Id 문제로 옳습니다. 따라서 모든 레코드를 목록에 저장해야합니까 (아마도 3000)? 그러나 이번에는 행을 삭제할 수 없으며, 그렇습니다. 포함 할 수 있습니다. – legomolina