簡體   English   中英

傳遞連接表以查看為 model Asp.Net Core

[英]Passing joined table to view as model Asp.Net Core

我有 2 個通過 linq 查詢加入的表:

var catData = from c in _context.ProductCategory
              join d in _context.ProductCategoryData
                     on c.Id equals d.ProductCategoryId into g
              from gg in g.DefaultIfEmpty()
              select new { c.Id, c.Name, gg.Path };

我想將此查詢的結果作為 model 傳遞給查看。 問題是視圖需要強烈指定類型的 model 我正在傳遞。

我聽說可以引入另一個 class,它將包含 2 個表模型,然后將 2 個表加入這個 class。 但是,在我看來,它效率不高,因為我將始終擁有兩個表中的所有列,而我只需要特定的列。

我想到的另一個選擇 - 使用如下所示的 ExpandoObject:

dynamic model = new ExpandoObject();
model = catData.ToList();

return View("Categories", model);

然后在視圖中訪問動態 object,如下所示:

@model dynamic;

@foreach (var i in Model)
{
   <img src="@i.Path">
       <p>@i.Name</p>
}

但是,這會引發錯誤,即 Model object 不包含路徑或名稱。

有沒有其他方法可以解決這個問題?

最好的方法是創建一個新的 CatData 和 ViewModel 類

public class CatData
{
public int Id {get; set;}
public string Name {get; set;}
public string Path {get; set;}
}

public class CatDataViewModel
{
  public IEnumerable<CatData> CatDataList {get; set;}
}

修復您的查詢

var catData = ( from ...
              select new CatData { Id= c.Id, Name =c.Name, Path= gg.Path }
              ).ToList();

var model= new CatDataViewModel { CatDataList=catData };

並查看

@model CatDataViewModel;

@foreach (var i in Model.CatDataList)
{
   <img src="@i.Path">
       <p>@i.Name</p>
}

您需要的是IEnumerable<dynamic>而不是dynamic的。 dynamic僅用作 object 公開屬性/方法,並且不能是任意對象的IEnumerable 如您所見, ExpandoObject實際上是鍵值對的IEnumerable (成員名稱和成員值之間的映射)。 但這不是你想要的那種IEnumerable

這段代碼:

dynamic model = new ExpandoObject();
model = catData.ToList();

實際上會將您的model設置為{ c.Id, c.Name, gg.Path }的列表。 所以它不像你想象的那樣動態。

以下是構建IEnumerable<dynamic>的方法:

var model = catData.Select(e => {
               dynamic o = new ExpandoObject();
               o.Id = e.Id;
               o.Name = e.Name;
               o.Path = e.Path;
               return o;
            });

model 是一個真正的IEnumerable<dynamic> ,它現在應該可以工作了。

您還可以編寫一個擴展方法來將普通的IEnumerable<T>轉換為IEnumerable<dynamic>以使用這種特殊場景,如下所示:

public static class DynamicEnumerableExtensions {
     public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> items) {
            var props = typeof(T).GetProperties();
            foreach(var item in items)
            {
                var o = new ExpandoObject();
                //set properties for the dynamic item
                foreach(var prop in props)
                {
                    o.TryAdd(prop.Name, prop.GetValue(item));
                }
                yield return o;
            }
     }
}

並像這樣使用它:

var model = catData.AsDynamic();

使用這種方便的方法,您不必每次都手動重寫邏輯,例如任意匿名對象的新列表(具有未知數量的屬性)。

暫無
暫無

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

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