【问题标题】:Getting null when concatenating string in linq在 linq 中连接字符串时获取 null
【发布时间】:2023-03-18 15:59:01
【问题描述】:

这是我的查询:

var db = new data.MQSDataContextDataContext();
string MonthY = divWave.InnerText.Substring(0, divWave.InnerText.IndexOf(","));
int waveN = Convert.ToInt32(divWave.InnerText.Substring(divWave.InnerText.IndexOf(",") + 1, 2));
int WorsheetID = Convert.ToInt32(Request.QueryString["id"]);
var wsItems = from wi in db.VendorOfferWorsheetItems
              where wi.WorksheetID == Convert.ToInt32(WorsheetID)
              select new resultsForGrid
              {
                  id = wi.id,
                  waveItemID = wi.waveItemID,
                  MName = wi.MName,
                  MQS_Code = wi.MQS_Code,
                  CustomerItemCode = wi.CustomerItemCode,
                  ItemDesc = wi.ItemDesc,
                  UOM = wi.UOM,
                  Ext = wi.Ext,
                  gCost = wi.gCost,
                  Vname = wi.Vname,
                  BestOffer = wi.BestOffer,
                  Margin = wi.Margin,
                  VendorOfferUOM = wi.VendorOfferUOM,
                  ItemWaveViewUrl = "../Waves/ViewWaveItemDetails.aspx?CurrentMonthYear=" + MonthY + "&CurrentWaveN=" + waveN.ToString() + "&Customer=" + divCustomer.InnerText + "&CustomerItemCode=" + wi.CustomerItemCode + "&UOM=" + wi.UOM + "&ItemNo=" + wi.MQS_Code
              };

t-sql(也为 ITemWaveViewUrl 返回 null:

 SELECT ((((@p1 + [t0].[CustomerItemCode]) + @p2) + [t0].[UOM]) + @p3) + [t0].[MQS_Code] AS [ItemWaveViewUrl], [t0].[id], [t0].[waveItemID], [t0].[MName], [t0].[MQS_Code], [t0].[CustomerItemCode], [t0].[ItemDesc], [t0].[UOM], [t0].[Ext], [t0].[gCost], [t0].[Vname], [t0].[BestOffer], [t0].[Margin], [t0].[VendorOfferUOM]
    FROM [dbo].[VendorOfferWorsheetItems] AS [t0]
    WHERE [t0].[WorksheetID] = @p0

为什么 ItemWaveViewUrl 总是返回 null?

【问题讨论】:

  • 您确定 ItemWaveViewUrl 为空吗?是否有可能 wsItems 是 null 因为 WorksheetID 上没有匹配项?
  • 我得到了 3000 个结果,除了 ItemViewUrl 之外的值
  • 去掉+开始的所有东西,检查值是否不为空,添加下一个+变量,检查值是否不为空等。或者使用String.Format("../url?cv={0}&sec={1} etc", wi.gCost, wi.Margin)
  • 我认为 string.Format 不会转换为 SQL。字符串连接发生在 SQL 中,而不是 LINQ。

标签: c# .net sql-server linq linq-to-sql


【解决方案1】:

在 LinqToSql 中,如果将字符串与 null 值连接,则会得到 null

这是因为查询被转换为使用+ (String Concatenation) 的选择:

就像对空值执行的算术运算一样, 当一个空值被添加到一个已知值时,结果通常是 未知值,一个字符串连接操作,使用 一个空值也应该产生一个空结果。

您可以通过在查询中使用 AsEnumerable 使用 LinqToObjects 转换结果来解决此问题。

var worksheetId = Convert.ToInt32(WorsheetID);
var wsItems = db.VendorOfferWorsheetItems
    .Where(wi => wi.WorksheetID == worksheetId)
    .AsEnumerable()
    .Select(wi => new resultsForGrid
            {
              id = wi.id,
              waveItemID = wi.waveItemID,
              MName = wi.MName,
              MQS_Code = wi.MQS_Code,
              CustomerItemCode = wi.CustomerItemCode,
              ItemDesc = wi.ItemDesc,
              UOM = wi.UOM,
              Ext = wi.Ext,
              gCost = wi.gCost,
              Vname = wi.Vname,
              BestOffer = wi.BestOffer,
              Margin = wi.Margin,
              VendorOfferUOM = wi.VendorOfferUOM,
              ItemWaveViewUrl = "../Waves/ViewWaveItemDetails.aspx?CurrentMonthYear=" + MonthY + "&CurrentWaveN=" + waveN.ToString() + "&Customer=" + divCustomer.InnerText + "&CustomerItemCode=" + wi.CustomerItemCode + "&UOM=" + wi.UOM + "&ItemNo=" + wi.MQS_Code
          });

【讨论】:

  • 通过一些快速的谷歌搜索,似乎互联网同意你的看法。不过,参考一些官方文档会使这成为一个更好的答案。
  • 你是对的,CustomerItemCode 在所有记录中都是空的。
  • LINQ2SQL 仅将您的编码意图转换为底层数据库的 SQL。这就是第二种方法有效的原因,因为 wi 已经是客户端类型的实例,这要归功于 AsEnumerable()。这里唯一的挑战是,如果 VendorOfferWorsheetItems 有额外的 100 列,您也会将它们带入,从而检索到比实际需要的更多的数据。
  • @Darek 绝对正确。这可以通过在AsEnumerable 之前进行额外的选择来解决,只选择相关的列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多