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)")
中添加模型映射
- 有什么方法可以添加 orderBy 和 Column2 变量吗?
您需要使用 .Select<T>
而不是 .Select()
来确保所选实体的类型正确。所以在你的情况下你需要 .Select<FinalModel>
.
使用 as
转换运算符将 source-entity 中的属性“重命名”为目标实体 (FinalModel)
如果要输入结果,也使用.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; }
}
}
您可以使用 Select
、ToDynamicList
和 OrderBy($"{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();
我有一个 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)")
中添加模型映射- 有什么方法可以添加 orderBy 和 Column2 变量吗?
您需要使用
.Select<T>
而不是.Select()
来确保所选实体的类型正确。所以在你的情况下你需要.Select<FinalModel>
.使用
as
转换运算符将 source-entity 中的属性“重命名”为目标实体 (FinalModel)如果要输入结果,也使用
.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; }
}
}
您可以使用 Select
、ToDynamicList
和 OrderBy($"{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();