在linq-to-sql查询中调用字符串操作方法的问题

时间:2011-01-25 08:30:12

标签: c# linq linq-to-sql

我在尝试使用LINQ调用字符串操作方法时遇到了令人沮丧的问题。我现在已经做了很多搜索,并尝试了各种方法让下面标记为'FAILS'的行工作。它目前抛出异常。

我尝试过的一些事情:

a)最初,连锁密钥的创建在同一个查询中,没有改变任何内容

b)将非字符串字段转换为字符串(另外整个可以使用.ToString在linq中不起作用。尝试使用String.Concat和String.Format,在某些情况下可以正常工作,但在尝试引用时则不行之后的那个值)

c)使用concat等而不是'+'将事物连接在一起。

正如您所看到的,将字符串附加到非字符串似乎相当宽容,但在调用该方法时

有很多行,所以我不想将数据转换为列表/数组等,但如果这是唯一的选择,那么任何建议都会受到赞赏。

非常感谢! - 马克

    var vouchers = from v in db.Vouchers
                   select new
                   {
                       v.Amount,
                       v.Due_Date,
                       v.Invoice_Date,
                       v.PO_CC,
                       v.Vendor_No_,
                       v.Invoice_No_,
                       invoiceNumeric = MFUtil.StripNonNumeric(v.Invoice_No_)
                   };


    var keyedvouchers = from vv in vouchers
                        select new
                        {
                            thekey = vv.Vendor_No_ + "Test", // works with normal string
                            thekey2 = vv.Amount + "Test", // works with decimal
                            thekey3 = vv.Invoice_Date + "Test", // works with date
                            thekey4 = vv.invoiceNumeric, // works
                            thekey5 = vv.invoiceNumeric + "Test" // FAILS
                        };

- 剥离字符的方法---

   public static string StripNonNumeric(string str) 
   {
        StringBuilder sb = new StringBuilder();
        foreach (char c in str) 
        {
            // only append if its withing the acceptable boundaries
            // strip special chars: if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') | || (c >= 'a' && c <= 'z') | c == '.' || c == '_') 

            // strip any nonnumeric chars
            if (c >= '0' && c <= '9')
                {
                sb.Append(c);
                }
        }
        return sb.ToString();
    }

- 异常消息 -

System.InvalidOperationException未被用户代码处理   消息=无法翻译表达式'表(凭证)。选择(v =&gt; new&lt;&gt; f__AnonymousType0 7(Amount = v.Amount, Due_Date = v.Due_Date, Invoice_Date = v.Invoice_Date, PO_CC = v.PO_CC, Vendor_No_ = v.Vendor_No_, Invoice_No_ = v.Invoice_No_, invoiceNumeric = StripNonNumeric(v.Invoice_No_))).Select(vv => new <>f__AnonymousType1 5(thekey =(vv.Vendor_No_ +“Test”),key2 =(转换(vv。金额)+“测试”),键3 =(转换(vv.Invoice_Date)+“测试”),键4 = vv.invoiceNumeric,键5 =(vv.invoiceNumeric +“测试”)))'进入SQL并且无法对待它作为一个地方表达。

2 个答案:

答案 0 :(得分:3)

这是因为它试图构建表达式的SQL查询,并且MFUtil.StripNonNumeric无法转换为SQL。

首先尝试返回它,然后将reult转换为列表,然后使用第二个查询进行转换。

var vouchers_temp = from v in db.Vouchers
               select new
               {
                   v.Amount,
                   v.Due_Date,
                   v.Invoice_Date,
                   v.PO_CC,
                   v.Vendor_No_,
                   v.Invoice_No_
               };


var vouchers = vouchers_temp.ToList().Select( new {
                   Amount,
                   Due_Date,
                   Invoice_Date,
                   PO_CC,
                   Vendor_No_,
                   Invoice_No_,
                   invoiceNumeric = MFUtil.StripNonNumeric(Invoice_No_)
});

答案 1 :(得分:0)

它无法工作,因为它不能起作用。

创建一个SQL端函数并在查询中调用它。