第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

C# 表達(dá)式按關(guān)鍵字段對(duì)通用查詢進(jìn)行排序

C# 表達(dá)式按關(guān)鍵字段對(duì)通用查詢進(jìn)行排序

C#
慕村225694 2022-11-13 13:40:51
我有一個(gè)通用方法,我想在其中IQueryable<T>按其關(guān)鍵字段對(duì) an 進(jìn)行排序(可以安全地假設(shè)只有一個(gè))。因此:void DoStuff<T>(...) {   IQueryable<T> queryable = ... // given   PropertyInfo keyField = ... // given   var sortedQueryable = queryable.OrderBy(<some expression here>);   ...}如何定義一個(gè)Expression將返回的keyField屬性,T以便它可以工作?
查看完整描述

3 回答

?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊

這并不太難,但是您需要調(diào)用OrderBywith reflection,因?yàn)槟孪炔恢狸P(guān)鍵字段的類型。因此,鑒于您已經(jīng)顯示的代碼,您將執(zhí)行以下操作:


// Build up the property expression to pass into the OrderBy method

var parameterExp = Expression.Parameter(typeof(T), "x");

var propertyExp = Expression.Property(parameterExp, keyField);

var orderByExp = Expression.Lambda(propertyExp, parameterExp);


// Note here you can output "orderByExp.ToString()" which will give you this:

//  x => x.NameOfProperty


// Now call the OrderBy via reflection, you can decide here if you want 

// "OrderBy" or "OrderByDescending"

var orderByMethodGeneric = typeof(Queryable)

    .GetMethods()

    .Single(mi => mi.Name == "OrderBy" && mi.GetParameters().Length == 2);


var orderByMethod = orderByMethodGeneric.MakeGenericMethod(typeof(T), propertyExp.Type);


// Get the result

var sortedQueryable = (IQueryable<T>)orderByMethod

    .Invoke(null, new object[] { queryable, orderByExp });


查看完整回答
反對(duì) 回復(fù) 2022-11-13
?
拉丁的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊

與 DavidG 答案中的想法相同,但方法不同


// build lambda expression (T t) => t.KeyField

var type = typeof(T);

var parameter = Expression.Parameter(type, "k");

var lambda = Expression.Lambda(Expression.Property(parameter, keyField), parameter);


// get source expression

var baseExpression = queryable.Expression;


// call to OrderBy

var orderByCall = Expression.Call(

    typeof(Queryable),

    "OrderBy",

    new[] {type, keyField.PropertyType},

    baseExpression, lambda

);


// sorted result

var sorted = queryable.Provider.CreateQuery<T>(orderByCall);


查看完整回答
反對(duì) 回復(fù) 2022-11-13
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

我喜歡使用具有 T 類型 Id 屬性的接口 IBaseEntity。這將使您的查詢:


void DoStuff<IBaseEntity>(...) 

{

   IQueryable<IBaseEntity> queryable = ... // given

   var sortedQueryable = queryable.OrderById(e=> e.Id); //extension method

   ...

}

擴(kuò)展方法:


public static IQueryable<IBaseEntity<T>> OrderById<T>(this IQueryable<IBaseEntity<T>> query)

{

   return query.OrderBy(e => e.Id);

}

每個(gè)實(shí)體都會(huì)實(shí)現(xiàn) IBaseEntity 并具有類似的東西


public partial class MyEntity : IBaseEntity<long>

{

  [Required]

  public override long  Id 

  {

    get { return base.Id;}

    set { base.Id = value;}

  }

}

然后在上下文中


modelBuilder

  .Entity<MyEntity>()

  .ToTable("DatabaseTable", "DatabaseSchema")

  .HasKey(e => e.Id)

  .Property(e => e.Id)

  .HasColumnName("DatabasePrimaryKey")                

.HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);

注意:這需要在上下文和實(shí)體中進(jìn)行一些設(shè)置。數(shù)據(jù)庫可以具有您想要的任何鍵,您可以將它們單獨(dú)映射到上下文的 OnModelCreating 方法中的屬性 Id。


查看完整回答
反對(duì) 回復(fù) 2022-11-13
  • 3 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)