簡體   English   中英

LINQ where未知類型的表達

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM