我有一个数据库,其中所有表都有一个名为ID
的主键。
我不想为我的所有表创建多个GetObjectForId,我想创建一个带有IQueryable和Type的泛型方法,然后尝试从IQueryable选择中获取一个对象(如果可能的话)。
我在想这样的事情:
public IQueryable<Type> GetObjectForIdInCollection(IQueryable selection, Type t, int id)
{
return selection.Cast<T>().Where(c => c.ID == id).FirstOrDefault()
}
显然这段代码是完全错误的,但你明白了我想要做的事情。
这是个好主意吗?我该如何实现这种方法?
答案 0 :(得分:3)
如果您使用的是Code-First,那么您可以创建BaseEntity
类并从此类派生所有实体。
public abstract class BaseEntity
{
public int ID { get; set; }
}
然后,
public T GetObjectForIdInCollection<T>(IQueryable<T> selection, int id)
where T : BaseEntity
{
return selection.Where(c => c.ID == id).FirstOrDefault();
// Or you can simply use:
// return selection.FirstOrDefault(c => c.ID == id);
}
答案 1 :(得分:1)
你可以创建一个基础接口,所有实体都可以实现:
public interface IIdObject
{
int Id { get; set; }
}
// ...
public T GetObjectForIdInCollection<T>(IQueryable<T> selection, int id)
where T : IIdObject
{
return selection.FirstOrDefault(c => c.Id == id);
}
但我不认为这是值得的。
答案 2 :(得分:1)
您的类应该实现IEntity
接口,您也可以使用扩展方法:
public interface IEntity
{
int Id { get; set; }
}
public static class Extention
{
public static Type GetObjectForIdInCollection<Type>(this IQueryable<Type> selection, int id)
where Type : class, IEntity
{
return selection.FirstOrDefault(c => c.Id == id);
}
}
用法:
var item = source.GetObjectForIdInCollection(1);
答案 3 :(得分:0)
我认为你必须从ID为属性的基类(基类型BaseModel)继承所有模型,然后:
public GetById<T>(int id, IRepository repo) where T : BaseModel
{
IQueryable<T> setQuery = repo.Get<T>();
return setQuery.FirstOrDefault(q => q.Id== id);
}