C# 从lambda表达式获取自定义对象
我有这个方法:C# 从lambda表达式获取自定义对象,c#,linq,lambda,C#,Linq,Lambda,我有这个方法: public static SiteSettingEntity GetSettings<SiteSettingEntity>(string siteId, Expression<Func<SiteSettingEntity, object>> properties) { // This method returns a SiteSettingEntity // fill
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
}
公共静态站点设置实体
GetSettings(字符串siteId,
表达式属性)
{
//此方法返回SiteSettingEntity
//填充在我的表达式中选择的值
}
如果要调用:
var _siteSetting = SiteSettingService.GetSettings<SiteSettingEntity>(SiteID,
s => new { s.BillCycleType, s.InvoiceComment,
s.AllowInvoiceDetailApproval, s.JobMinimumHours });
var\u siteSetting=SiteSettingService.GetSettings(SiteID,
s=>新的{s.BillCycleType,s.InvoiceComment,
s、 AllowWinVoiceDetailApproval,s.JobMinimumHours});
因此,这将返回一个由lambda表达式选择的填充了属性的对象
我的问题是:如何使用表达式动态返回相同的自定义对象
举个例子:如果要使用.Select(s=>new{filed1=data.FieldX})
,则只需在返回对象中使用属性.filed1
谢谢 如果要返回动态对象,可以执行以下使用ExpandooObject的简单示例:
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.");
}
dynamic duck=new DuckFactory().GetDuck();
//在使用该属性之前,请检查该属性是否存在
if(((IDictionary)duck).ContainsKey(“名称”))
{
Console.WriteLine(duck.Name);//打印Fauntleroy
}
其他的
{
WriteLine(“可怜的鸭子没有名字。”);
}
请记住,强类型对象不会给您带来好处。这是我最初的方法:
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);
}
publicstatict GetSettings(字符串siteId、表达式属性)
{
字符串查询=$“从{SiteSettingEntity.TABLE_NAME}(NOLOCK)中选择前1个{DbTool.GetSqlFields(properties)},其中Sites.SiteID=@SiteID”;
var参数=新字典
{
{“SiteID”,SiteID},
};
var _data=DbTool.SqlExec(PowerDetailContext.GetConnectionString(siteId),CommandType.Text,query,parameters);
返回_data!=null?_data.FirstOrDefault():默认值(T);
}
Ang当我打电话时,我有:
var _siteSetting = SiteSettingService.GetSettings<SiteSettingEntity>(SiteID, s => new { s.BillCycleType, s.InvoiceComment, s.AllowInvoiceDetailApproval, s.JobMinimumHours });
var\u siteseting=SiteSettingService.GetSettings(SiteID,s=>new{s.BillCycleType,s.InvoiceComment,s.AllowInvoiceDetailApproval,s.JobMinimumHours});
我想要的var_siteSetting只是在调用时在new{}之间选择属性。如果我尝试使用_siteSetting.OtherProperty,“OtherProperty”将在代码中不可用。再次阅读后,我想您只是试图从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);
}
公共静态SiteSettingEntity GetSettings(字符串siteId、表达式属性)
{
字符串查询=$“从{SiteSettingEntity.TABLE_NAME}(NOLOCK)中选择前1个{DbTool.GetSqlFields(properties)},其中Sites.SiteID=@SiteID”;
var参数=新字典
{
{“SiteID”,SiteID},
};
var _data=DbTool.SqlExec(PowerDetailContext.GetConnectionString(siteId),CommandType.Text,query,parameters);
返回_data!=null?_data.FirstOrDefault():默认值(SiteSettingEntity);
}
很抱歉,您想做什么还不清楚。是否要从lambda表达式中提取字段值?是否尝试执行类似的操作?是否尝试找出如何返回动态对象?是的,我要从表达式中提取所有属性并返回仅包含这些属性的“自定义对象”。