簡體   English   中英

Linq 表達式中的 Int.Parse

[英]Int.Parse in Linq Expression

我有以下 LINQ 表達式。 我想計算nvarchar字段中數值的總和。 我正在使用以下代碼來執行此操作,但是當我嘗試運行它時出現錯誤。

var m = new MaterialModelContainer();

var list = 
    (from x in
        (
            from inv in m.INVs
            join l in m.LIBs on inv.MESC equals l.MESC
            join o in m.OUTs on inv.MESC equals o.MESC
            join t in m.TRANs on inv.MESC equals t.MESC
            where t.TYPE == "60"
            select new
            {
                l.MESC,
                l.LINE_NO,
                l.UNIT_LINE,
                Description = l.DES + " " + l.PART_NO,
                inv.NEW_QTY,
                o.PJ,
                o.DATE,
                o.QTY,
                o.QTY_REC,
                TranQty = t.QTY,
                tranDate = t.DATE
            }
        )
        group x by
            new
            {
                x.MESC,
                x.LINE_NO,
                x.UNIT_LINE,
                x.Description,
                x.NEW_QTY,
                x.PJ,
                x.DATE,
                x.QTY,
                x.QTY_REC
            }
        into g
        select new
        {
            QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty))
        }
    ).ToList();

錯誤描述:

LINQ to Entities 無法識別 'Int32 Parse(System.String)' 方法,並且此方法無法轉換為存儲表達式

我怎樣才能解決這個問題並編寫比這更好的代碼?

我將代碼更改為:

select new
{
    QTY_Consum_1 = g.Where(c => SqlFunctions.StringConvert(c.tranDate) >= cuDate && SqlFunctions.StringConvert(c.tranDate) <= endDate).Sum(d => SqlFunctions.StringConvert(d.TranQty)),
   g.Key.MESC
}
).ToList();

但出現此錯誤:在此處輸入圖像描述

EF 5:

而不是int.Pasrse使用Convert.ToInt32 實體框架將在SQL中生成適當的CAST函數。

EF 6:

簡短回答:

youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE)

答案很長:

在EF 6中,您必須使用SqlFunctions.StringConvert將數值轉換為字符串。 但它有一個問題。 它會為結果添加不必要的空格。 所以比較會失敗。 這就是我把Trim()放在那里的原因。 我用EF 6.1.1進行了測試。

SqlFunctions.StringConvert(variable)替換所有的int.Parse 沒有將String轉換為Int的函數。 您應該嘗試執行反轉並使用StringConvert將Int轉換為String。

SqlFunctions實用程序將能夠在SQL命令中轉換該命令。

實體框架無法將該類型的轉換轉換為SQL。

您是否有可能改變數據結構以使用正確的數據類型,例如實際的DateTime類型? 對於大數據量,這樣的轉換會影響性能。

我建議您更改數據模型類型以避免這些轉換,或者如果數據量總是很小 ,則先獲取數據,然后再使用Linq to Objects。

在你的where子句中,你不能調用int.Parse 實體框架不知道如何將其轉換為SQL。 考慮修改你的Where

你不能在where使用int.parse。 您可以像這樣重寫您的查詢:

var list = (from x in
                (
                    from inv in m.INVs
                    join l in m.LIBs on inv.MESC equals l.MESC
                    join o in m.OUTs on inv.MESC equals o.MESC
                    join t in m.TRANs on inv.MESC equals t.MESC
                    where t.TYPE == "60" && t.QTY!=""
                    select new
                       {
                           l.MESC,
                           l.LINE_NO,
                           l.UNIT_LINE,
                           Description = l.DES + " " + l.PART_NO,
                           inv.NEW_QTY,
                           o.PJ,
                           o.DATE,
                           o.QTY,
                           o.QTY_REC,
                           TranQty = t.QTY,
                           tranDate = t.DATE

                      }
                ).ToList()
            group x by
                new
                    {
                        x.MESC,
                        x.LINE_NO,
                        x.UNIT_LINE,
                        x.Description,
                        x.NEW_QTY,
                        x.PJ,
                        x.DATE,
                        x.QTY,
                        x.QTY_REC
                    }
            into g
            select new
                {
                    QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty)),
                    g.Key.MESC
                }
           ).ToList();

調用.ToList()方法,然后使用int.Parse(variable)

祝你今天愉快。

如果您需要很多,我推薦CodeFirstStoreFunctions

Step0 -> CodeFirstStoreFunctions nuget 安裝

Step1-> 創建一個簡單的 sql 標量函數

 CREATE FUNCTION [dbo].[ToInt32](@Value VARCHAR(255)) 
 RETURNS INT
 AS
 BEGIN
 RETURN CONVERT(INT, (CASE WHEN ISNUMERIC(@Value) = 1 THEN @Value ELSE 
 '0' END))
 END

Step2 -> 添加OnModelCreating

mb.Conventions.Add(new FunctionsConvention("dbo", typeof(SqlHelper)));

Step3 -> 構建 SqlHelper 類

[DbFunction("CodeFirstDatabaseSchema", "ToInt32")]
public static int ToInt32(string value) => throw new NotSupportedException();

結果 -> 在此處輸入圖像描述

當你需要確保在LINQ to Entities中使用CLR方法時,你最好咨詢這個來源: https//msdn.microsoft.com/en-us/library/vstudio/dd456828(v = vs.100) .aspx

這不是一個快速的閱讀,它需要時間,但這是你的問題的答案(更多的是它)。

有一個構建嚴重的數據庫,我無法編輯,但必須使用它。

我在Linq-To-Sql中使用它,它可以工作。

首先將字符串強制轉換為object,然后將其強制轉換為int。

 from s in db.Students
 select new
 {
     s.Name,
     s.Surname,
     Birthday = new DateTime((int)(object)(s.dateStr.Substring(0, 4)),
                             (int)(object)(s.dateStr.Substring(4, 2)),
                             (int)(object)(s.dateStr.Substring(6, 2))),
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM