未知类型的表达式
本文关键字:表达式 类型 未知 | 更新日期: 2023-09-27 18:15:31
我有一个数据库,其中所有表都有一个主键名为ID
。
我不想让多个GetObjectForId为我所有的表,我想做一个通用的方法,需要IQueryable和一个类型,然后尝试从IQueryable选择一个对象,如果可能的话。
我在想这样的事情:
public IQueryable<Type> GetObjectForIdInCollection(IQueryable selection, Type t, int id)
{
return selection.Cast<T>().Where(c => c.ID == id).FirstOrDefault()
}
显然这段代码是完全错误的,但是你知道我想做什么。
这是个好主意吗?我如何实现这个方法?
如果您使用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);
}
您可以创建一个基本接口,所有实体都可以实现:
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);
}
但是我觉得不值得。
你的类应该实现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);
我认为您必须从具有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);
}