【问题标题】:Get custom object from lambda expression从 lambda 表达式获取自定义对象
【发布时间】:2017-08-31 03:35:18
【问题描述】:

我有这个方法:

 public static SiteSettingEntity 
       GetSettings<SiteSettingEntity>(string siteId, 
                 Expression<Func<SiteSettingEntity, object>> properties)
 {
     // This method returns a SiteSettingEntity
     // filled with the values  selected in my expression
 }

如果要调用:

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

所以这会返回一个对象,其中填充了我的 lambda 表达式选择的属性。

我的问题是:如何使用我的表达式动态返回自定义对象?

举个例子:如果你想使用.Select(s =&gt; new{ filed1 = data.FieldX}),你可以在返回对象中使用属性.filed1

谢谢!

【问题讨论】:

  • 对不起,但目前还不清楚您要做什么。您想从 lambda 表达式中提取字段值?
  • 你在尝试做类似this的事情吗?
  • 您是否想弄清楚如何返回动态对象?
  • 是的,我想从表达式中提取所有属性并返回一个只有这些属性的“自定义对象”。

标签: c# linq lambda


【解决方案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.");
}

请记住,您不会获得强类型对象的好处。

【讨论】:

    【解决方案2】:

    这是我原来的方法:

    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 只是在我调用时在 new{} 之间选择属性。如果我尝试使用 _siteSetting.OtherProperty,代码中将无法使用“OtherProperty”。

    【讨论】:

      【解决方案3】:

      再次阅读后,我想您只是想从 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);
          }
      

      【讨论】:

        猜你喜欢
        • 2012-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多