2017-08-30 108 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); 
    }