none
EntityFramework中如何将nvarchar字段与int字段比较大小(有没有CAST之类的方法)? RRS feed

  • 问题

  • 我有一个老数据库.结构不允许更改的情况下.如果在查询的时候将nvarchar字段转为int字段进行比较 ?


    • 已编辑 hbszsl 2013年12月5日 2:18
    2013年12月5日 2:15

答案

  • 还有个办法就是tolist()后再本地做convert 动作.不过这样效率会慢点。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月9日 8:07
    版主

全部回复

  • 1,EntityFramework 允许你直接执行 SQL 语句,所以所有 SQL 的语法都支持;

    2,如果你要使用 LINQ,你可以在 LINQ 语句中来做转换,类似 Int.Parse( nvarcharFiled) == intField 。


    • 已编辑 Skyseer 2013年12月5日 3:28
    2013年12月5日 3:27
  • 你好,

    楼主你是要在where条件里做转换吗?如果是的话, 就需要我们在edmx文件里自己定义转换了.以楼主的要求为例子, 将nvarchar字段转为int字段进行比较:、

    先定义一个如下的类:

     public partial class EdmxExtensionMethods : DbContext
        {
            [EdmFunction("DataBaseFirstDBModel", "ToString")]
            public static string ToString(int value)
            {
                return Convert.ToString(value);
            }
    }

     

    然后再edmx文件的CSDL的Schema节点下定义如下转换:

    <Function Name="ToString" ReturnType="Edm.String">
              <Parameter Name="inputvalue" Type="Edm.Int32" />
              <DefiningExpression>
                cast(inputvalue as Edm.String)
              </DefiningExpression>
            </Function>

    这样就可以在查询里使用转换了:

     var result = (from order in db.Orders
                                  where EdmxExtensionMethods.ToString(order.OrderID) == "1"
                                  select order).ToList();


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2013年12月5日 9:14
    版主
  • LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。

    1,EntityFramework 允许你直接执行 SQL 语句,所以所有 SQL 的语法都支持;

    2,如果你要使用 LINQ,你可以在 LINQ 语句中来做转换,类似 Int.Parse( nvarcharFiled) == intField 。



    2013年12月7日 5:41
  • 你好,

    楼主你是要在where条件里做转换吗?如果是的话, 就需要我们在edmx文件里自己定义转换了.以楼主的要求为例子, 将nvarchar字段转为int字段进行比较:、

    先定义一个如下的类:

     public partial class EdmxExtensionMethods : DbContext
        {
            [EdmFunction("DataBaseFirstDBModel", "ToString")]
            public static string ToString(int value)
            {
                return Convert.ToString(value);
            }
    }

     

    然后再edmx文件的CSDL的Schema节点下定义如下转换:

    <Function Name="ToString" ReturnType="Edm.String">
              <Parameter Name="inputvalue" Type="Edm.Int32" />
              <DefiningExpression>
                cast(inputvalue as Edm.String)
              </DefiningExpression>
            </Function>

    这样就可以在查询里使用转换了:

     var result = (from order in db.Orders
                                  where EdmxExtensionMethods.ToString(order.OrderID) == "1"
                                  select order).ToList();


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    我是使用codefirst定义的实体.没有edmx文件 
    2013年12月7日 5:42
  • 我当然知道可以直接执行SQL,我是想知道有没有办法不拼凑SQL
    2013年12月9日 1:17
  • 你好,

    Code First的话那只能在实体类里做转换了,想这样:

    public string UserId { get; set; }
    
        public int UserIntId 
        {
           get { return Int32.Parse(UserId); }
           set { UserId = value.ToString(); }
        }

    这需要我们为要转换的property再定义一个不会映射到数据库的property.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月9日 1:17
    版主
  • 你好,

    Code First的话那只能在实体类里做转换了,想这样:

    public string UserId { get; set; }
    
        public int UserIntId 
        {
           get { return Int32.Parse(UserId); }
           set { UserId = value.ToString(); }
        }

    这需要我们为要转换的property再定义一个不会映射到数据库的property.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

     Int32.Parse是不能被Linq2Entites识别的
    2013年12月9日 6:40
  • LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。

    1,EntityFramework 允许你直接执行 SQL 语句,所以所有 SQL 的语法都支持;

    2,如果你要使用 LINQ,你可以在 LINQ 语句中来做转换,类似 Int.Parse( nvarcharFiled) == intField 。



    var result = from order in db.Orders
                                 
    where int.Parse(order.OrderID) == 1
                                 
    select order;

    你是说上面这个语句编译不通过吗?我能编译通过。


    你能不能把你的代码贴出来看看。
    • 已编辑 Skyseer 2013年12月9日 6:46
    2013年12月9日 6:45
  • 还有个办法就是tolist()后再本地做convert 动作.不过这样效率会慢点。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月9日 8:07
    版主