修正多處 LINQ-to-Entities 查詢,避免 Nullable .Contains()、.ToString()、Request[] 直接使用造成翻譯失敗。

API 查詢同步改寫 .Contains()、.OrderBy()、複雜 GroupBy/Math.Round,必要時 materialize 或加 HasValue。
Participation rate / kind breakdown 改在記憶體計算,同時檢查整數陣列 .Contains() 的型別安全性。
This commit is contained in:
2025-11-14 23:40:55 +08:00
parent 4fcbfb3801
commit 27f916eb9c
14 changed files with 245 additions and 115 deletions

View File

@@ -26,68 +26,91 @@ public partial class admin_follower_print_ : System.Web.UI.Page
//紀錄匯出條件
string _query = "";
var qry = _db.pro_order.AsQueryable();
if (!string.IsNullOrEmpty(Request["order_no"]))
// ❌ 錯誤寫法: qry = qry.Where(o => o.order_no.Contains(Request["order_no"].Trim()));
// LINQ to Entities 無法轉換 Request[] 方法,必須先轉換為變數再使用
string orderNoParam = Request["order_no"]?.Trim();
if (!string.IsNullOrEmpty(orderNoParam))
{
qry = qry.Where(o => o.order_no.Contains(Request["order_no"].Trim()));
_query += "單號:" + Request["order_no"].Trim() + "\n";
qry = qry.Where(o => o.order_no.Contains(orderNoParam));
_query += "單號:" + orderNoParam + "\n";
}
if (!string.IsNullOrEmpty(Request["subject"]))
string subjectParam = Request["subject"]?.Trim();
if (!string.IsNullOrEmpty(subjectParam))
{
qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(Request["subject"].Trim()));
_query += "報名活動:" + Request["subject"].Trim() + "\n";
qry = qry.Where(o => o.activity_num.HasValue && o.activity.subject.Contains(subjectParam));
_query += "報名活動:" + subjectParam + "\n";
}
if (!string.IsNullOrEmpty(Request["u_name"]))
string uNameParam = Request["u_name"]?.Trim();
if (!string.IsNullOrEmpty(uNameParam))
{
qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(Request["u_name"].Trim()));
_query += "姓名/名稱:" + Request["u_name"].Trim() + "\n";
qry = qry.Where(o => o.f_num.HasValue && o.follower.u_name.Contains(uNameParam));
_query += "姓名/名稱:" + uNameParam + "\n";
}
if (!string.IsNullOrEmpty(Request["introducerTxt"]))
string introducerParam = Request["introducerTxt"]?.Trim();
if (!string.IsNullOrEmpty(introducerParam))
{
qry = qry.Where(o => o.introducer.HasValue && o.follower1.u_name.Contains(Request["introducerTxt"].Trim()));
_query += "介紹人:" + Request["introducerTxt"].Trim() + "\n";
qry = qry.Where(o => o.introducer.HasValue && o.follower1.u_name.Contains(introducerParam));
_query += "介紹人:" + introducerParam + "\n";
}
if (!string.IsNullOrEmpty(Request["actItemTxt"]))
string actItemParam = Request["actItemTxt"]?.Trim();
if (!string.IsNullOrEmpty(actItemParam))
{
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem.subject.Contains(Request["actItemTxt"].Trim()) ).Count() > 0);
_query += "品項:" + Request["actItemTxt"].Trim() + "\n";
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem.subject.Contains(actItemParam)).Count() > 0);
_query += "品項:" + actItemParam + "\n";
}
if (!string.IsNullOrEmpty(Request["keyin1"]))
{
qry = qry.Where(o => o.keyin1==Request["keyin1"].ToString());
// ❌ 錯誤寫法: qry = qry.Where(o => o.keyin1==Request["keyin1"].ToString());
// LINQ to Entities 無法轉換 Request[].ToString(),必須先轉換為變數再使用
string keyin1Value = Request["keyin1"]?.ToString();
qry = qry.Where(o => o.keyin1 == keyin1Value);
_query += "單據狀態:" + Model.pro_order.keyin1_value_to_text( Request["keyin1"].Trim()) + "\n";
}
if (!string.IsNullOrEmpty(Request["address"]))
string addressParam = Request["address"]?.Trim();
if (!string.IsNullOrEmpty(addressParam))
{
qry = qry.Where(o => o.address.Contains(Request["address"].Trim()));
_query += "地址:" + Request["address"].Trim() + "\n";
qry = qry.Where(o => o.address.Contains(addressParam));
_query += "地址:" + addressParam + "\n";
}
if (!string.IsNullOrEmpty(Request["up_time1"]))
{
qry = qry.Where(o => o.up_time >= Convert.ToDateTime(Request["up_time1"].Trim()));
_query += "報名日期(起):" + Convert.ToDateTime(Request["up_time1"].Trim()).ToString("yyyy/MM/dd") + "\n";
DateTime upTime1Param = Convert.ToDateTime(Request["up_time1"].Trim());
qry = qry.Where(o => o.up_time >= upTime1Param);
_query += "報名日期(起):" + upTime1Param.ToString("yyyy/MM/dd") + "\n";
}
if (!string.IsNullOrEmpty(Request["up_time2"]) )
if (!string.IsNullOrEmpty(Request["up_time2"]))
{
qry = qry.Where(o => o.up_time < Convert.ToDateTime(Request["up_time2"]).AddDays(1));
_query += "報名日期(訖):" + Convert.ToDateTime(Request["up_time2"].Trim()).ToString("yyyy/MM/dd") + "\n";
DateTime upTime2Param = Convert.ToDateTime(Request["up_time2"].Trim());
qry = qry.Where(o => o.up_time < upTime2Param.AddDays(1));
_query += "報名日期(訖):" + upTime2Param.ToString("yyyy/MM/dd") + "\n";
}
if (!string.IsNullOrEmpty(Request["country"]))
string countryParam = Request["country"]?.ToString();
if (!string.IsNullOrEmpty(countryParam))
{
qry = qry.Where(o => o.f_num != null && o.follower.country == Request["country"]);
_query += "國家:" + (_db.countries.Where(x => x.ID == Request["country"]).Select(x => x.name_zh).FirstOrDefault()??"") + "\n";
qry = qry.Where(o => o.f_num != null && o.follower.country == countryParam);
_query += "國家:" + (_db.countries.Where(x => x.ID == countryParam).Select(x => x.name_zh).FirstOrDefault() ?? "") + "\n";
}
if (!string.IsNullOrEmpty(Request["country2"]))
string country2Param = Request["country2"]?.ToString();
if (!string.IsNullOrEmpty(country2Param))
{
if (Request["country2"] == "1")
if (country2Param == "1")
{
qry = qry.Where(o => o.f_num != null && o.follower.country == "158");
}
else if (Request["country2"] == "2")
else if (country2Param == "2")
{
qry = qry.Where(o => o.f_num != null && o.follower.country != "158");
}
_query += "國家:" + (_db.countries.Where(x => x.ID == Request["country2"]).Select(x => x.name_zh).FirstOrDefault()??"") + "\n";
_query += "國家:" + (_db.countries.Where(x => x.ID == country2Param).Select(x => x.name_zh).FirstOrDefault() ?? "") + "\n";
}
if (!string.IsNullOrEmpty(Request["hasPrice"]))
{
@@ -105,12 +128,15 @@ public partial class admin_follower_print_ : System.Web.UI.Page
if (!string.IsNullOrEmpty(Request["year"]))
{
title.Text = "報名管理報表";
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Year == Convert.ToInt32(Request["year"]));
int yearParam = Convert.ToInt32(Request["year"]);
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Year == yearParam);
_query += "年份:" + Request["year"] + "\n";
}
if (!string.IsNullOrEmpty(Request["month"]))
{
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Month == Convert.ToInt32(Request["month"]));
int monthParam = Convert.ToInt32(Request["month"]);
qry = qry.Where(o => o.up_time.HasValue && o.up_time.Value.Month == monthParam);
_query += "月份:" + Request["month"] + "\n";
}
if (!string.IsNullOrEmpty(Request["season"]))
@@ -139,24 +165,32 @@ public partial class admin_follower_print_ : System.Web.UI.Page
_query += "季度:" + Request["season"] + "\n";
}
if (!string.IsNullOrEmpty(Request["chk_hasact"]) && Convert.ToBoolean(Request["chk_hasact"]) )
if (!string.IsNullOrEmpty(Request["chk_hasact"]) && Convert.ToBoolean(Request["chk_hasact"]))
{
_query += "活動報名\n";
if (!string.IsNullOrEmpty(Request["chk_noact"]) && Convert.ToBoolean(Request["chk_noact"]))
{
_query += "非活動報名\n";
if (!string.IsNullOrEmpty(Request["select_act"]) && Convert.ToInt32(Request["select_act"]) > 0)
if (!string.IsNullOrEmpty(Request["select_act"]))
{
qry = qry.Where(o => o.activity_num.HasValue && o.activity_num.Value == Convert.ToInt32(Request["select_act"]));
int selectActParam = Convert.ToInt32(Request["select_act"]);
if (selectActParam > 0)
{
qry = qry.Where(o => o.activity_num.HasValue && o.activity_num.Value == selectActParam);
}
}
}
else
{
qry = qry.Where(o => o.activity_num.HasValue);
if (!string.IsNullOrEmpty(Request["select_act"]) && Convert.ToInt32(Request["select_act"]) > 0)
if (!string.IsNullOrEmpty(Request["select_act"]))
{
qry = qry.Where(o => o.activity_num.Value == Convert.ToInt32(Request["select_act"]));
int selectActParam = Convert.ToInt32(Request["select_act"]);
if (selectActParam > 0)
{
qry = qry.Where(o => o.activity_num.Value == selectActParam);
}
}
}
@@ -165,13 +199,18 @@ public partial class admin_follower_print_ : System.Web.UI.Page
{
if (!string.IsNullOrEmpty(Request["chk_noact"]) && Convert.ToBoolean(Request["chk_noact"]))
{
qry = qry.Where(o => o.activity_num==null);
qry = qry.Where(o => o.activity_num == null);
_query += "非活動報名\n";
}
}
if (!string.IsNullOrEmpty(Request["select_actitem"]) && Convert.ToInt32(Request["select_actitem"]) > 0)
if (!string.IsNullOrEmpty(Request["select_actitem"]))
{
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem_num.Value == Convert.ToInt32(Request["select_actitem"])).Count() > 0);
int selectActItemParam = Convert.ToInt32(Request["select_actitem"]);
if (selectActItemParam > 0)
{
qry = qry.Where(o => o.pro_order_detail.Where(f2 => f2.actItem_num.HasValue && f2.actItem_num.Value == selectActItemParam).Count() > 0);
}
}
if (!string.IsNullOrEmpty(Request["year"]))