[英]SELECT result map to entity in Dynamic Linq in Entity Framework Core
我有一個 Linq 查詢,它根據某些條件動態選擇 2 列(可以是所有列中的任意 2 列)。我需要 map 查詢結果低於 model,而不管選擇的列名
public class FinalModel
{
public string Text { get; set; }
public string Id { get; set; }
}
目前我正在使用反射到 map 結果到那個 model 因為我得到了一些匿名對象列表並且它工作正常,但是我想刪除那個反射並且需要在 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)")中添加 model 映射
您需要使用.Select<T>
而不僅僅是.Select()
來確保所選實體的類型正確。 所以在你的情況下你需要.Select<FinalModel>
。
使用as
cast 運算符將屬性從源實體“重命名”為目標實體 (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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.