2017-08-30 125 views
1

獲取自定義對象我有這樣的方法。從lambda表達式

我的問題是:我如何使用我的表達式動態返回自定義對象?舉個例子:如果你想使用.Select(s => new{ filed1 = data.FieldX}),你可以使用屬性.filed1作爲回報對象。如果你想使用.Select(s => new{ filed1 = data.FieldX}),你可以使用屬性.filed1作爲回報對象。

謝謝!

+4

對不起,但它不是很清楚你想要做什麼。你想從lambda表達式中提取字段值? –

+0

你是否試圖做類似於[this](https://stackoverflow.com/questions/45874566/how-to-expand-object-to-primitive-properties-using-linq/45876836#45876836)? – luxun

+0

你想弄清楚如何返回一個動態對象? –

回答

1

如果你試圖返回一個動態對象,你可以不喜歡使用ExpandoObject的這個簡單的例子:

public class DuckFactory 
{ 
    public ExpandoObject GetDuck() 
    { 
     dynamic duck = new ExpandoObject(); 
     duck.Name = "Fauntleroy"; 
     return duck; 
    } 
} 

然後調用它像:

dynamic duck = new DuckFactory().GetDuck(); 

// Check the property exists before using it 
if (((IDictionary<string, Object>)duck).ContainsKey("Name")) 
{     
    Console.WriteLine(duck.Name); // Prints Fauntleroy 
} 
else 
{ 
    Console.WriteLine("Poor duck doesn't have a name."); 
} 

只要記住你贏了」不會得到強類型對象的好處。

0

這是我原來的方法:

public static T GetSettings<T>(string siteId, Expression<Func<SiteSettingEntity, object>> properties) 
    { 
     string query = $"SELECT TOP 1 {DbTool.GetSqlFields(properties)} FROM {SiteSettingEntity.TABLE_NAME} (NOLOCK) WHERE Sites.SiteID = @SiteID"; 

     var parameters = new Dictionary<string, object> 
     { 
      {"SiteID", siteId}, 
     }; 

     var _data = DbTool.SqlExec<T>(PowerDetailContext.GetConnectionString(siteId), CommandType.Text, query, parameters); 

     return _data != null ? _data.FirstOrDefault() : default(T); 
    } 

昂時,我的電話我有這樣的:

var _siteSetting = SiteSettingService.GetSettings<SiteSettingEntity>(SiteID, s => new { s.BillCycleType, s.InvoiceComment, s.AllowInvoiceDetailApproval, s.JobMinimumHours }); 

了var _siteSetting我只想有間選擇了性能的新{}當我打了電話。如果我嘗試使用_siteSetting。 OtherProperty,「OtherProperty」將不會在代碼中可用。

0

再次閱讀後,我想你只是想從GetSettings方法返回SiteSettingEntity。

public static SiteSettingEntity GetSettings<T>(string siteId, Expression<Func<SiteSettingEntity, object>> properties) 
    { 
     string query = $"SELECT TOP 1 {DbTool.GetSqlFields(properties)} FROM {SiteSettingEntity.TABLE_NAME} (NOLOCK) WHERE Sites.SiteID = @SiteID"; 

     var parameters = new Dictionary<string, object> 
     { 
      {"SiteID", siteId}, 
     }; 

     var _data = DbTool.SqlExec<SiteSettingEntity>(PowerDetailContext.GetConnectionString(siteId), CommandType.Text, query, parameters); 

     return _data != null ? _data.FirstOrDefault() : default(SiteSettingEntity); 
    }