簡體   English   中英

SELECT 結果 map 到 Entity Framework Core 動態 Linq 中的實體

[英]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 映射

  1. 有沒有辦法用 Column2 變量添加orderBy
  1. 您需要使用.Select<T>而不僅僅是.Select()來確保所選實體的類型正確。 所以在你的情況下你需要.Select<FinalModel>

  2. 使用as cast 運算符將屬性從源實體“重命名”為目標實體 (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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM