2015-06-22 63 views
1

我想從SQl中選擇幾列,然後更新該表。Linq更新,特定選擇列爲空

我用

var xyz_repl= from mfrepl in xyz_repl_alias 
       where (mfrepl.RPT_ID == sched_data.NOTIF_RPT_ID) 
       && (mfrepl.NOTIF_ID == "" || mfrepl.NOTIF_ID == null) 
       select mfrepl; 

這也我的工作,但後來它不工作,如果有一列是NULL.Then我試圖只選擇特定的列,但現在卻變成只讀的,我無法更新表。

我這樣做:

var xyz_repl= from mfrepl in xyz_repl_alias 
       where (mfrepl.RPT_ID == sched_data.NOTIF_RPT_ID) 
       && (mfrepl.NOTIF_ID == "" || mfrepl.NOTIF_ID == null) 
       select new 
        { 
        mfrepl.NOTIF_ID, 
        mfrepl.REPL_DTM, 
        mfrepl.REPL_TYPE, 
        mfrepl.RPT_ID, 
        mfrepl.RPT_VERS 
        } ; 

注意 - 它現在顯示爲匿名type.What我需要做任何suugestion?

UPDATE 我增加了一個類,即:

public class MyPoco 
    { 
     public string NOTIF_ID { get; set; } 
     public DateTime REPL_DTM { get; set; } 
     public string REPL_TYPE { get; set; } 
     public string RPT_ID { get; set; } 
     public string RPT_VERS { get; set; } 

    } 

,改變了我的代碼

var xyz_repl = from mfrepl in xyz_repl_alias 
where (mfrepl.RPT_ID == sched_data.NOTIF_RPT_ID) && (mfrepl.NOTIF_ID == "" || mfrepl.NOTIF_ID == null) 
select new MyPoco { 
NOTIF_ID=mfrepl.NOTIF_ID, 
REPL_DTM=mfrepl.REPL_DTM, 
REPL_TYPE=mfrepl.REPL_TYPE, 
RPT_ID=mfrepl.RPT_ID, 
RPT_VERS=mfrepl.RPT_VERS }; 

但現在

db.SubmitChanges(); is not working.It won`t update databse now.Any suggestion. 
+0

如果你的數據庫列可空,那麼你相應的類類型應可爲空也。這將防止該問題,因此您不必選擇匿名類型。 – mattytommo

+0

@mattytommo我加了CanBeNull = true但沒用。我不想獲取所有的列,因爲很多列在後面的程序中沒用,並且包含大量數據。 – v2v2

+0

我不知道這是否會對你有幫助:在'new'裏面,你可以控制空字段並給它們一個默認值。例如'new'中的一個字段:'REPL_DTM = mfrepl.REPL_DTM == null? false:mfrepl.REPL_TYPE;' – mggSoft

回答

0

你的問題是,你的模型與你的數據庫不一樣,如果你可以直接選擇行(你說的Linq2SQL而不是Linq2Entities),那麼你可以再次更新它,你會這樣做。

如果您選擇一個匿名類型,則會丟失上下文連接,並且不能使用SubmitChanges(),因爲它沒有被上下文跟蹤。

大多數現實世界的實現中的問題之一是數據庫必須與模型匹配才能正常工作,對原有數據庫使用Linq2SQLLinq2Entities通常會使您像這樣遇到問題。

如果行數很大,正如您在註釋中所暗示的那樣,我會定義一個新模型「table」,它只選擇列的一個子集,然後使用該模型更新行。

(我使用術語rowentityLinq2Entities不同,因爲我不知道在Linq2SQL適當的期限)

+0

謝謝你的答覆先生。但我映射他們。我的SQL模式看起來像** REPL_GUID \t VARCHAR,** ** REPL_TYPE \t VARCHAR,** ** RPT_ID \t VARCHAR,** ** RPT_VERS \t VARCHAR,** ** RPT_BYTES \t bigint,** ** REPL_DTM \t datetime,** ** NOTIF_ID \t varchar,**和我在Model類中做出的相同。現在,爲了解決我的問題,我已經從模型中刪除了列,但這只是一個解決方法(不好的)。 – v2v2

+0

如我所述,在模型中使用兩個表格,一個用於數據庫中的整個表格,另一個用於選擇此特定場景所需的列。 – flindeberg

+0

EntityFramework中的術語是「表格拆分」。 – flindeberg