【问题标题】:Convert string to int in linq-to-sql query: how to deal with values which cannot be converted?在 linq-to-sql 查询中将字符串转换为 int:如何处理无法转换的值?
【发布时间】:2013-05-22 07:38:39
【问题描述】:

我正在对数据库运行此查询:

var result = (from leads in dc.T_DM_FactDemandeWebLeads
                         join  demands in dc.T_DM_DimDemandeWebs on leads.DemandeWeb_FK equals demands.DemandeWeb_PK
                         join  temps in dc.T_DM_Temps on demands.DateDemande_FK equals temps.Temps_PK
                         where leads.longitudeClient != null && (Convert.ToInt32(leads.GeolocDistanceRouteDistrib) > 1000*30) && (temps.Date > new DateTime(2000, 1, 1).Date)
                         select new Lead
                         {

                             lng = leads.longitudeClient,     

                             lat = leads.latitudeClient,

                             distance = leads.GeolocDistanceRouteDistrib

                         }).Take(1000000);

问题:这条线有问题:

(Convert.ToInt32(leads.GeolocDistanceRouteDistrib) > 1000*30)

as Lead.GeolocDistanceRouteDistrib 是一个 VARCHAR,在某些情况下采用“未知”,导致 format exception

Conversion failed when converting the varchar value 'Unknown' to data type int.

这个问题解决了here,但是方法不能转换成SQL。

问题:有没有办法重写查询,以便在查询执行期间完成转换?

【问题讨论】:

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


    【解决方案1】:

    使用this answer 中的技术在您的 dbml 文件中创建 IsNumeric sql 函数。 并在您的查询中使用它。

    类似这样的:

    join  temps in dc.T_DM_Temps on demands.DateDemande_FK equals temps.Temps_PK
    where dc.ISNUMERIC(leads.GeolocDistanceRouteDistrib) // Added!
    where leads.longitudeClient != null && (Convert.ToInt32(leads.GeolocDistanceRouteDistrib) > 1000*30) && (temps.Date > new DateTime(2000, 1, 1).Date)
    select new Lead
    

    【讨论】:

    • 似乎是个好主意,但我仍然得到错误:无论如何调用了转换。
    【解决方案2】:

    .AsEnumerable() 添加到您的实体中,然后您可以使用所有方法

    var result = (from leads in dc.T_DM_FactDemandeWebLeads.AsEnumerable()
                             join  demands in dc.T_DM_DimDemandeWebs on leads.DemandeWeb_FK equals demands.DemandeWeb_PK
                             join  temps in dc.T_DM_Temps on demands.DateDemande_FK equals temps.Temps_PK
                             where leads.longitudeClient != null && (Convert.ToInt32(leads.GeolocDistanceRouteDistrib) > 1000*30) && (temps.Date > new DateTime(2000, 1, 1).Date)
                             select new Lead
                             {
                                 lng = leads.longitudeClient,     
                                 lat = leads.latitudeClient,
                                 distance = leads.GeolocDistanceRouteDistrib
                             }).Take(1000000);
    

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2013-02-28
      • 2011-11-16
      • 1970-01-01
      • 2017-10-06
      相关资源
      最近更新 更多