未知类型的表达式

本文关键字:表达式 类型 未知 | 更新日期: 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);
        }