[英]LINQ Where expression of unknown type
我有一個數據庫,其中所有表都有一個名為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()
}
顯然,這段代碼是完全錯誤的,但是您知道我正在嘗試執行的操作。
這是一個好主意嗎? 我該如何實現這種方法?
如果使用的是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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.