SELECT 结果映射到 Entity Framework Core 中 Dynamic Linq 中的实体

SELECT result map to entity in Dynamic Linq in Entity Framework Core

我有一个 Linq 查询,它是 selecting 2 列(可以是所有列中的任意 2 列)动态地基于某些 condition.I 需要将查询结果映射到下面的模型,而不管selected 列名称

public class FinalModel
{ 
    public string Text { get; set; }
    public string Id { get; set; }
}

目前我正在使用反射将结果映射到该模型,因为我得到了一些匿名对象列表并且它工作正常,但我想删除该反射并需要在 select 本身,我当前的实现如下所示

 string column1 = "Name" //can be other columns also
 string column2 = "Age"
 var result = _context.table1
                      .Select("new ("+ column1 +","+ column2 +")")
                      .Distinct()
                      .Take(10) // having more records in table
                      .ToDynamicList()
                      .Select(x => new FinalModel()
                       {
                           Id = x.GetType().GetProperty(column1).GetValue(x).ToString(),
                           Text = x.GetType().GetProperty(column2).GetValue(x).ToString(),
                       });
                      

上面的代码工作正常,但我需要删除下面的部分

       .Select(x => new FinalModel()
              {
                 Id = x.GetType().GetProperty(column1).GetValue(x).ToString(),
                 Text = x.GetType().GetProperty(column2).GetValue(x).ToString(),
              });

有什么方法可以删除反射并直接在 Select("new (column1,column2)")

中添加模型映射
  1. 有什么方法可以添加 orderBy 和 Column2 变量吗?
  1. 您需要使用 .Select<T> 而不是 .Select() 来确保所选实体的类型正确。所以在你的情况下你需要 .Select<FinalModel>.

  2. 使用 as 转换运算符将 source-entity 中的属性“重命名”为目标实体 (FinalModel)

  3. 如果要输入结果,也使用.ToDynamicList<FinalModel>()

完整示例代码如下:

using System.Linq.Dynamic.Core;

class Program
{
    static void Main(string[] args)
    {
        var myQuery = new[] { new XModel { Age = "1", Name = "n" } }.AsQueryable();

        string column1 = "Name";
        string column2 = "Age";

        var result = myQuery
            .Select<FinalModel>("new (" + column1 + " as Id, " + column2 + " as Text)")
            .Distinct()
            .Take(10)
            .ToDynamicList<FinalModel>();

        Console.WriteLine(result[0].Id + "  " + result[0].Text);
    }


    public class XModel
    {
        public string Name { get; set; }
        public string Age { get; set; }
    }

    public class FinalModel
    {
        public string Text { get; set; }
        public string Id { get; set; }
    }
}

您可以使用 SelectToDynamicListOrderBy($"{column2}") 的通用版本进行排序:

var result = _context.table1
    .Select<FinalModel>($"new ({column1} as Id, {column2} as Text)")
    .Distinct()
    .OrderBy("Text")
    .Take(10)
    .ToDynamicList<FinalModel>();

或者如果你想坚持动态:

var result = _context.table1
    .Select($"new ({column1}, {column2})")
    .Distinct()
    .OrderBy($"{column2}")
    .Take(10) 
    .ToDynamicList()
    .Select(d => new FinalModel()
    {
        Id = d[column1].ToString(),
        Text = d[column2].ToString(),
    })
    .ToList();