LINQ凡表达未知类型

时间:2016-10-28 07:59:18

标签: c# linq

我有一个数据库,其中所有表都有一个名为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()
} 

显然这段代码是完全错误的,但你明白了我想要做的事情。

这是个好主意吗?我该如何实现这种方法?

4 个答案:

答案 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);
        }