我有一個 Linq 查詢,它根據某些條件動態選擇 2 列(可以是所有列中的任意 2 列)。我需要將查詢結果映射到下面的模型中,而不管選擇的列名如何
public class FinalModel
{
public string Text { get; set; }
public string Id { get; set; }
}
目前我正在使用反射將結果映射到該模型,因為我得到了一些匿名物件串列并且作業正常,但是我想洗掉該反射并需要在選擇本身中添加映射,我當前的實作是像下面
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)")中添加模型映射
- 有沒有辦法用 Column2 變數添加orderBy ?
uj5u.com熱心網友回復:
您可以使用 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();
uj5u.com熱心網友回復:
您需要使用
.Select<T>而不僅僅是.Select()確保所選物體的型別正確。所以在你的情況下你需要.Select<FinalModel>.使用
as強制轉換運算子將屬性從源物體“重命名”為目標物體 (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; }
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/471241.html
