【问题标题】:Convert string into lambda expression c# (linq to entity)将字符串转换为 lambda 表达式 c# (linq to entity)
【发布时间】:2014-05-28 19:51:14
【问题描述】:

我正在尝试创建一个执行以下操作的动态系统:

dbContext.Users.Where(x=>(x.Initials + " " + x.Surname).Contains("someGivenString")).ToList();

在我的动态系统中,我有一个字符串:

string combined = "x.Inititals + \" \" + x.Surname";

我想知道如何使用 Expression.Call 来为此创建正确的查询。

我希望我的问题足够清楚。提前致谢!

【问题讨论】:

  • 您可以轻松地将您的用户列表转换为数据表,并在其上简单地构建 SQL where 子句,这样会更好,无需在运行时编译代码。

标签: c# linq lambda entity-framework-5 expression


【解决方案1】:

您可以使用运行时 C# 编译。更多信息和示例请看这里:http://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime

明确一点:例如,您可以准备模板并使用自己的 lambda 表达式完成它,然后该字符串在运行时编译和运行。

【讨论】:

    【解决方案2】:

    扩展我的评论。如果您的对象仅包含简单属性,请将其转换为数据表,如下所示:

    public static DataTable ObjectToData(object o)
         {
             DataTable dt = new DataTable("OutputData");
    
             DataRow dr = dt.NewRow();
             dt.Rows.Add(dr);
    
             o.GetType().GetProperties().ToList().ForEach(f =>
             {
                 try
                 {
                     f.GetValue(o, null);
                     dt.Columns.Add(f.Name, f.PropertyType);
                     dt.Rows[0][f.Name] = f.GetValue(o, null);
                 }
                 catch { }
             });
    
             return dt;
         }
    

    我写这个是为了我的特殊需要,但你应该明白。

    然后进行整个选择,这很容易构建非常非常自定义的 where 子句。喜欢

    WHERE 首字母 + ' ' + surname like '%someGivenString%'

    然后您只需为查询排序或选择表。我喜欢使用简单的自制课程:

    public static class CTableManager
    {
        public static DataTable Select(DataTable dt, string sFilter)
        {
            DataTable dtResult = dt.Clone();
    
            try
            {
                dtResult = dt.Select(sFilter).CopyToDataTable();
            }
            catch { }
    
            return dtResult;
        }
    
        public static DataTable Sort(DataTable dt, string sOrder)
        {
             DataTable dtResult = dt.Clone();
    
             try
             {
                 dt.DefaultView.Sort = sOrder;
    
                 dtResult = dt.DefaultView.ToTable().Copy();
             }
             catch { }
    
             return dtResult;
        }
    
         public static DataTable SelectAndSort(DataTable dt, string sFilter, string sOrder)
        {
            DataTable dtResult = dt.Copy();
    
            if (sFilter != string.Empty)
            {
                dtResult = Select(dtResult, sFilter);
            }
    
            if (sOrder != string.Empty)
            {
                dtResult = Sort(dtResult, sOrder);
            }
    
            return dtResult;
        }
    }
    

    【讨论】:

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