簡體   English   中英

如何使用LINQ和變量動態查詢數據庫?

[英]How to dynamically query the database using LINQ and a variable?

我有一個數據庫表,它有 100 列,標記為 D1、D2、D3,依此類推到 100。

在我的方法 (ASP.NET MVC) 中,我需要檢查這些列是否為空,然后再將它們顯示在我視圖中的表中。 我真的不想這樣做

if(db.Datatable.Select(x=>x.D1).FirstOrDefault() != null)
{
  //do code
}
if(db.Datatable.Select(x=>x.D2).FirstOrDefault() != null)
{
  //do code
}
if(db.Datatable.Select(x=>x.D3).FirstOrDefault() != null)
{
  //do code
}

這將是 100 個 if 語句,看起來很糟糕。 所以我在這里開始了這段代碼:

  for(int i = 1; i < 100; i++)
  {
       var dbField = "D" + i;  //D1,D2,D3....

       var currField = db.Datatable.Select(x => x.dbField).FirstOrDefault();


       //here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view
  }

除了 LINQ/C# 不喜歡這個。 它顯然在 Select 語句中的 dbField 上引發錯誤。 你不能只設置 .Select(x=x.variable)。 我已閱讀有關創建您自己的 lambda 表達式樹並構建自定義動態查詢的內容,對如何執行此操作有任何想法嗎? 如何為 Select 語句自定義創建字段名稱? 謝謝你。

沒有理由重復從同一個不變的集合中取出第一個元素。 簡單地從集合中取出第一個元素,然后使用檢索到的對象:

var element = db.Datatable.FirstOrDefault();

這已經極大地簡化了您的代碼提高了性能(因為您不需要迭代每個屬性的集合):

if(element.D1 != null)
{
    //do code
}

// and so on...

不清楚為什么需要確定每個字段包含非空值。 您從未發布任何顯示您打算如何使用這些值的代碼。

//here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view

通常,最好簡單地確保您的視圖可以處理 nulls ,因為這意味着您無需擔心在某個值為 null 時執行的代碼。

如果這是不可能的,那么簡單地將null值轉換為默認的非空值仍然更容易。 這意味着您仍然不必擔心空值(在您轉換它們之后),因為您將不再有任何空值。

一個簡單的方法是使用空合並運算符,例如

var firstName = element.D1 ?? String.Empty;

這確保null值被替換為默認值(您可以指定,我只是在這里選擇了一個空字符串,但您可以選擇任何您想要的)。

另請注意,您甚至不需要為不可空值(例如int執行此操作,因為這些值將自動默認為0

//here i would add the value to an array

為什么使用數組而不是對象? 目前尚不清楚為什么您對手動處理每個屬性(及其值)而不是通過自身傳遞對象感到死板,這無疑是傳遞數據的更好的 OOP 方式。

既想手動處理所有數據又不想處理所有數據是矛盾的。

我想如果你更准確地解釋你想做什么,我們將能夠更好地幫助你。

當我看到您編寫代碼時,我推斷您視圖中的表將僅顯示一條具有適當屬性/列的記錄。 如果你想這樣做,沒關系。

另一方面,根據列數迭代表是一個壞主意,因為您正在耦合兩個抽象級別。 我的意思是你的 MVC 方法不應該知道列數,這就是你正在做的“for(int i = 1; i < 100; i++)”。 確實,如果表模式更新並且列數發生變化會發生什么? 列的名稱相同嗎? 你的代碼會被破解!

我認為你把問題從錯誤的方面拿給了我。

暫無
暫無

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

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