Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 4

10
votes
answers
108 views
+10

如果为空则不要添加到列表c#[保留]

我正在尝试从匿名函数创建一个列表。如果请求模型属性不为null,我希望创建列表。目前,它正在向列表添加null

代码

  public void方法(RequestModel请求){var create = new DtoModel {docs = new List< docsModel> {request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction(request.ThirdDoc):null,}}; }   

目前,即使任何文档为null,它也会创建一个计数列表3。我将列出仅在docs不为null且列表应仅包含非null的文档时才创建。不应该有任何空值。请求模型可以包含x个文档。

我知道我之后可以使用Linq删除空值,但我正在寻找一个解决方案,它不会在列表中创建空元素。

沙发
+100

基本上你不能用集合初始化器 - 集合初始化器总是添加与逗号分隔列表中的条目相同数量的元素。(我想你可以有一个 Add 方法忽略空值的集合,但 Add 肯定会被调用相同的次数。)

,只需使用 if 语句:

  if(request.FirstDoc!= null){create.docs.Add(runFunction(request.FirstDoc)); } // etc   

您总是可以使用本地方法来简化:

  public void method(RequestModel request){var create = new DtoModel { docs = new List< docsModel>()}; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){create.docs.Add(runFunction(doc)); }}   

如果一切都为null,我最初错过了关于列表本身未被初始化的部分。为此,您需要更改它以在每次添加时检查初始化:

  public void method(RequestModel request){var create = new DtoModel() ; MaybeAdd(request.FirstDoc); MaybeAdd(request.SecondDoc); MaybeAdd(request.ThirdDoc); void MaybeAdd(docsModel doc){if(doc!= null){if(create。)docs == null){create.docs = new List< docsModel>(); } create.docs.Add(runFunction(doc));   

顺便说一句,我强烈建议您开始遵循正常的.NET命名约定,使用PascalCase来处理类型和属性( DocsModel Method RunFunction Docs )。

另外,我想(谦卑地)向OP推荐他/她检查三元运算符的工作原理docs.microsoft.com/en-us/dotnet/csharp/language-reference/ - burkay 8月30日22:46

@burkay:我没有看到他们不知道条件运算符的作用。我不认为这是令他们困惑的部分。 - Jon Skeet 8月31日5:50

板凳
-10

使用Linq

您可以使用一点LINQ完成您想要的任务。

  var create = new DtoModel {docs =(new [] {request.FirstDoc,request.SecondDoc,request.ThirdDoc})。Where(d => d!= null)。选择(d => runFunction(d))。ToList()};   

更长但更容易阅读

这有点难以阅读,所以我建议将其分解一下。

创建一个辅助方法将请求展开到数组中:

  static public T [] CreateArray< T>(params T [] input){return input; }   

然后以这种方式编写:

  var requests = CreateArray(request.FirstDoc,request.SecondDoc,request.ThirdDoc); var processedRequests = requests.Where(r => r!= null).Select(r => runFunction(r)); var create = new DtoModel {docs = processedRequests.ToList()};   

或者如果你喜欢使用三元运算符,就像在你的例子中一样,你可以这样做:

  public void method(RequestModel request){ var create = new DtoModel {docs = CreateArray(request.FirstDoc!= null?runFunction(request.FirstDoc):null,request.SecondDoc!= null?runFunction(request.SecondDoc):null,request.ThirdDoc!= null?runFunction (request.ThirdDoc):null,}。Where(d => d!= null).ToList()};
     
			
        

OP表示不使用linq。我同意他的看法。要构造一个包含空值的列表,然后构造另一个带有空值的过滤器,那么从一开始就以正确的方式构造它就没有意义了。 - 丹尼尔施密德8月31日7:28

仔细读。我相信他不想使用linq“之后删除空值”,即希望魔法在集合初始化器中发生。我认为我的代码确实如此。 - John Wu 8月31日7:30

在上一个示例中,您创建一个数组,然后过滤空值(Where(...)),然后从中创建一个List。这就是代码的作用 - Daniel Schmid 8月31日7:39

什么清单?我没有看到任何清单。我看到一个IEnumerable。列表创建一次,使用ToList(),具有正确数量的元素......全部在集合初始值设定项中。 - John Wu 8月31日7:40

13
votes
answers
34 views
+10

.Net Framework dll无法处理.Net标准项目

我已将 .Net framework ddl引用到 .Net standard 2.0 它将向我显示以下错误。

  System.Reflection.ReflectionTypeLoadException:'无法加载一个或多个请求的类型。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。给定的程序集名称或代码库'?inDebug etcoreapp2.1FirstDataBank.DrugServer.API.dll'无效。  

相同的ddl工作正常。

沙发
+60
+50

“.Net Framework dll无法处理.Net标准项目” - 嗯,是的; 这是正常的和预期的; 如果您需要使用仅适用于.NET Framework (而不是.NET Standard)的内容,那么:您应该只从一个本身就是.NET Framework的项目中使用它; 或者:考虑重新定位或多目标定位您正在使用的库(如果您控制它;否则:询问供应商),理想情况下,它可以作为针对.NET Standard或多目标的nupkg使用.NET Framework .NET标准。

+70

这根本不受支持。

您可以从.NET Framework项目中引用一些(但不是全部).NET标准库,但不支持其他方式。 < p> .NET Standard旨在支持不同平台之间的代码共享,但.NET Framework仅支持Windows。

为了帮助您开始讨论该主题,这里有一个很好的帖子,它解释得非常简短:< a href =“https://social.msdn.microsoft.com/Forums/vstudio/en-US/7035edc6-97fc-49ee-8eee-2fa4d040a63b/what-are-differences-between-net-framwork-net-standard- and-net-core?forum = clr“rel =”nofollow noreferrer“>标准,框架和核心之间的差异

@MarcGravell thx澄清,我会调整答案 - Michael Sander 8月28日9:31

0
votes
answers
41 views
+10

我怎麼能比較和SEACH字符串和日期時間C#

1

我創建像比較兩個字符串一個簡單的搜索:我怎麼能比較和SEACH字符串和日期時間C#

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.Title.Contains(searchWord) }, a => a.ArticleCategory); 

和工程罰款;但我想在日期時間(日期)搜索,我寫不同的代碼:

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==DateTime.Parse(searchWord) }, a => a.ArticleCategory); 

articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate.ToString("yyyyMMdd").Contains(searchWord) }, a => a.ArticleCategory); 

給我一個錯誤:

LINQ to Entities does not recognize the method 'System.DateTime Parse(System.String)' method, and this method cannot be translated into a store expression.

From this line int count = _db.Count();

我怎麼可以做一些字符串之間的比較和日期作爲一個字符串輸入日期(以不同的格式,如:2017/8/5或05/05/2017或2017-8-5或...)或甚至輸入一個數字(搜索所有日期有一個數字)?

沙发
0
2

當LINQ查詢被執行,它會得到轉換成等價的SQL語句。 DateTime.Parse是將字符串轉換爲相應的DateTime的C#方法。沒有相應的SQL等價物可以這樣做。

您需要在LINQ查詢之前創建一個DateTime對象並使用它。

var d = DateTime.Parse(searchWord); 
var result= someEntityCollection.Where(a =>a.CreatedTime==d)); 

如果CreatedTimeDateTime字段,則比較將包括時間戳以及。也就是說,它不會簡單地給記錄該日期,但日期和具體時間部分

如果你想過濾特定日期的記錄(沒有時間),你可以使用DbFunctions.TruncateTime helper方法這樣做

var d = DateTime.Parse(searchWord); 
var result= someEntityCollection.Where(a => 
      DbFunctions.TruncateTime(a.CreatedTime)== DbFunctions.TruncateTime(d.Date)) 

DbFunctions.TruncateTime助手方法內System.Data.Entity命名空間中定義。所以確保你有一個使用聲明來使用它。

using System.Data.Entity; 

而且它是安全的使用DateTime.ParseExactTryParseExact的格式,比採用DateTime.Parse

var d = DateTime.ParseExact(searchWord, "dd/MM/yyyy", CultureInfo.InvariantCulture); 
板凳
0
1

你需要做你的查詢外的轉換:

var date=DateTime.Parse(searchWord); 
articles = _service.ArticleRepository.GetAll(id, new Expression<Func<Article, bool>>[] { x => x.InsertDate ==date }, a => a.ArticleCategory); 
0
votes
answers
48 views
+10

返回列表到控制器asp.net的ajax調用

1

我想從我的控制器返回列表到AJAX調用中的成功函數。我能夠成功地從控制器返回列表,但在AJAX調用中,錯誤代碼被執行並且出現內部服務器錯誤。 我到處搜索相同的東西,但我無法找到發生這種情況的原因。返回列表到控制器asp.net的ajax調用

以下是我的AJAX:

$.ajax({ 
     type: "POST", 
     dataType: 'JSON', 
     url: "/BookUtility/GetHallsList", 
     success: function (hallsList) { 
      console.log(hallsList); 
     }, 
     error: function (xhr,status, exception) { 
      console.log("Error: " + exception + ", Status: " + status); 
     } 
    }); 

控制器:

Hall objHall = new Hall(); 
[HttpPost] 
public JsonResult GetHallsList() 
    { 
     var hallsList = objHall.GetHallsList(); 
     return Json(hallsList.ToList()); 
    } 

Hall.cs

public List<tblHall> GetHallsList() 
     { 
      List<tblHall> hallsList; 
      using (BookingSystemDBEntities db = new BookingSystemDBEntities()) 
      { 
       hallsList = db.tblHalls.ToList(); 
      } 
      return hallsList; 
     } 

我我也嘗試在我的控制器中使用List<tblHall> hallsList = objHall.GetHallsList();代替var hallsList = objHall.GetHallsList();,但這不起作用。

這是我得到的錯誤: Error I received

我要去哪裏錯了?

+0

你爲什麼要實例化Hall objHall = new Hall(); ? – Sajeetharan

+0

@Sajeetharan Hall.cs是一個模特班,我從中得到了大廳的名單。 –

+0

嘗試實例化它的方法 – Sajeetharan

沙发
0
0

正如您的錯誤所述,問題出在web api方法上。它應該拋出錯誤。 ObjectContext實例已被處置,並且不能再用於需要連接的操作。你可以通過設置來修復它

using (var contex = new BookingSystemDBEntities()) 
{ 
    context.Configuration.LazyLoadingEnabled = false; 
    hallsList = db.tblHalls.ToList(); 
} 
0
votes
answers
44 views
+10

當MetroTiles被移除時,MetroPanel滾動位置不重置

0

更新: 我沒有提及我也在使用MetroTabControl,因爲我認爲它不相關。但是,我做了更多的測試,下面是我的結果。我也會張貼這個作爲我自己問題的答案。當MetroTiles被移除時,MetroPanel滾動位置不重置

  1. MetroPanel這是造成問題的是不同的選項卡比按鈕,更新

我把不同的MetroPanel相同標籤的違規按鈕和中提琴上,該面板的工作完全正常。我繼續刪除原始的MetroPanel並在單獨的標籤頁上重新創建它。這似乎解決了問題。我不知道如何,但它在那裏。

原始文本:
情況是這樣的:

  1. MetroModernUI包由丹尼斯·馬格諾,V1.4.0安裝在一個MetroForm的 解決方案
  2. MetroPanelAutoScroll設置爲true水平處理 瓷磚
  3. MetroTiles在運行時基於給定的配置創建uration
  4. 當配置改變時,所有的瓦片被卸載並重新加載

注:我並不擔心卸載,每次重裝所有的磚的性能影響。我預計一次不會超過10個。

問題: 當水平滾動條被定位一路到面板的右側,和一個MetroTile被去除,不重置。這可以使滾動位置在實際的可滾動區域之外,就我所知。這會導致閃爍,我的MetroTiles實際上並沒有出現。我嘗試了所有我能想到的相關滾動屬性,但我不知所措。您可以在以下代碼片段中看到我正在使用AutoScrollPositionHorizontalScroll.Value來嘗試重置它,但它不會重置。

例子: 這裏是發生了什麼事的GIF: https://gyazo.com/362b83abae795f728675a3c11fcf6a29

代碼:

public void LoadTiles(MetroPanel panel) 
{ 
    foreach (Feed feed in Feeds.GetFeedsFromConfig()) 
    { 
     var tile = CreateTile(feed); 
     AddTile(panel, tile); 
    } 

} 
public void UnloadTiles(MetroPanel panel) 
{ 

    var tiles = panel.Controls.OfType<MetroTile>().ToArray(); 
    for(var i = tiles.Count()-1; i>=0; i--) 
    { 
     panel.Controls.Remove(tiles[i]); 
     tiles[i].Dispose(); 
    } 
    panel.AutoScrollPosition = new Point(0, 0); 
    panel.HorizontalScroll.Value = 0; 
} 
public void AddTile(MetroPanel panel, MetroTile tile) 
{ 
    var numTiles = panel.Controls.OfType<MetroTile>().Count(); 
    tile.Location = new Point(numTiles * 155, 0); 
    panel.Controls.Add(tile); 
} 
public MetroTile CreateTile(Feed feed) 
{ 
    MetroTile tile = new MetroTile(); 
    tile.Text = feed.Name; 
    tile.Style = MetroColorStyle.Purple; 
    tile.TileTextFontSize = MetroTileTextSize.Tall; 
    tile.UseStyleColors = true; 
    tile.Theme = MetroThemeStyle.Dark; 
    tile.Tag = feed; 
    tile.Click += new EventHandler(LoadFeedInBrowser); 
    tile.Size = new Size(150, 100); 
    return tile; 
} 
沙发
0
0

我沒有提到我也使用MetroTabControl因爲我沒有認爲這是相關的。但是,我做了更多的測試,下面是我的結果。我也會張貼這個作爲我自己問題的答案。

  1. MetroPanel這是造成問題的是不同的選項卡比按鈕,更新

我把不同的MetroPanel相同標籤的違規按鈕和中提琴上,該面板的工作完全正常。我繼續刪除原始的MetroPanel並在單獨的標籤頁上重新創建它。這似乎解決了問題。我不知道如何,但它在那裏。我唯一的猜測是,我不知何故搞砸了原來的MetroPanel

0
votes
answers
42 views
+10

從內容頁面調用主頁面的方法Web方法

0

我在主頁面上有一個方法(非靜態),將從內容頁面Method(靜態WebMethod)調用。 如 母版頁:從內容頁面調用主頁面的方法Web方法

public partial class User : System.Web.UI.MasterPage 
{ 
public void loadcart() 
{ 
//some code here that i will a div 
} 
} 

內容頁:

public partial class Menu : System.Web.UI.Page 
{ 
[webMethod] 
public static void Order() 
{ 
// some code here 
// call Master page method from here 
} 
} 

令()(內容頁面方法)將從jQuery的AJAX和loadcar()(母版頁功能)稱爲將在Order()函數中調用。

我需要從內容頁面調用母版頁方法。請爲我提供一些解決方案。

有什麼想法嗎?

+1

[主頁面調用方法]的可能重複(https://stackoverflow.com/questions/6332889/call-method-in-master-page) – Alexander

沙发
0
0

例如,如果您想調用loadcart,您可以執行masterpage的轉換。

  (this.Master as SiteMaster).loadcart(); 
0
votes
answers
54 views
+10

如何得到一個JSON結果/響應查看

0

我一直在試圖從我的控制器得到我的看法的響應,但我得到的只是純JSOn顯示(Firefox:圖像附加)或提示爲JSON文件下載。我嘗試了很多方法。請有人給我看看或給我的代碼,以便我可以在視圖上至少獲得成功,並可以顯示至少enter image description here的警報。如何得到一個JSON結果/響應查看

public JsonResult GetGata() 
    { 
     List<ProdVM > pvl = new List<ProdVM>(); 
     try 
     { 
      ProdVM pvm1 = new ProdVM(); 
      pvm1.ProductID = 1; 
      pvm1.ProductName = "Computer"; 
      pvl.Add(pvm1); 
      return Json(pvl, JsonRequestBehavior.AllowGet); 
      } 

     catch (Exception) 
     { 
      throw; 
     } 
    } 
$(document).ready(function() { 
$(document).ready(function() { 
    $('#myGrid').DataTable({ 
     "ajax": { 
      "url": "/Home/GetGata/", 
      "dataSrc": "" 
     }, 
     "columns": [ 
     { "data": "ProductName" }, 
     { "data": "ProductID" } 
     ] 
    }); 
}); 

});

沙发
0
0

數據表插件期望AJAX端點以這種格式

{"data":[["1","Computer"],["2","Camera"]]} 

可以看到,返回數據,每個項是一個數組(一個字符串數組,其中每個串產品屬性值)

這應該工作

public ActionResult GetData() 
{ 
    var items = new List<string[]> 
    { 
     new string[] {"1", "Computer"}, 
     new string[] {"2", "Camera"} 
    }; 
    return Json(new { data = items }, JsonRequestBehavior.AllowGet); 
} 

這應該工作假設你有一個這樣的表在頁面

<table id="example" class="display" cellspacing="0" width="100%"> 
    <thead> 
     <tr> 
      <th>Id</th> 
      <th>Name</th> 
     </tr> 
    </thead> 
</table> 

和JS代碼來調用端點獲得數據,並使用了數據表

$(function() { 
    $('#example').DataTable({ 
     "ajax": "@Url.Action("GetData")" 
    }); 
}); 
+0

謝謝您的回答。但是,我仍然遇到類似頁面的錯誤。 firefox只顯示json值和IE提示JSon下載。請有人幫助我。我被困在這裏,無法練習或學習任何關於來自.net控制器的json響應,我在成功獲得響應並在html上顯示。請有人看到這種情況,請幫助我。 –

+0

當您運行該頁面時,您將收到警告?如果您嘗試直接訪問端點,則可能會根據瀏覽器設置獲取錯誤。試着用postman/fiddler/advanced rest client chrome插件來訪問端點 – Shyju

+0

我可以在郵差中得到Json結果。但我需要在.cshtml(查看文件)。我通過本地訪問URL。爲了學習目的,我需要爲開發模式開發所有樣本。你能否給我一個Hello world類型的例子,你可以在你的Visual Studio的本地主機上看到,其中reponse來自控制器的JsonResult返回類型,並且你的jquer的成功可以在alert中捕獲它? –

0
votes
answers
44 views
+10

爲什麼我在客戶端出現錯誤`無法加載資源`?

0

我有這個元素在我的index.cshtml頁:爲什麼我在客戶端出現錯誤`無法加載資源`?

<section class="parallax parallax-2 padding-xxs" style="background-image: url('mySiteName/assets/images/shutterstoc/img1.jpg');"> 
    <div>some content </div> 
</section> 

正如你可以看到我有樣式屬性。

如果我改變風格屬性,這一點:

style="background-image: url('~/assets/images/shutterstoc/img1.jpg');" 

的背景圖像消失,我得到這個錯誤在Web控制檯:

Failed to load resource: the server responded with a status of 404 (Not Found) img1.jpg 

**更新*

The path to the image is: 
http://localhost/assets/images/shutterstoc/img1.jpg 
As you can see the mySiteName is missing. 

更新2: 我試試這個路徑:

<section class="parallax parallax-2 padding-xxs" style="background-image: url('./assets/images/img1.jpg')"> 

但我仍然得到上面的錯誤。 爲什麼我得到錯誤Failed to load resource以及如何解決它?

+0

爲什麼'?'而不是'.'? –

+0

只是使用'。 '而不是 –

+0

點的意義是什麼? – Michael

沙发
0
1

可以在剃刀視圖中使用蒂爾達標誌~以獲取應用根路徑。它不適用於CSS樣式表文件。

當剃鬚刀執行該視圖時,如果它發現~,它將被轉換爲應用根目錄路徑。

只需使用路徑沒有~

background-image: url('./assets/images/shutterstoc/img1.jpg'); 

圖片網址是相對樣式表。因此,根據樣式表和資產目錄的位置,根據需要將前綴.調整爲../

.someCssClass { 
    background-image: url('./assets/images/shutterstoc/img1.jpg'); 
} 

就像我如上所述,該圖像位置是相對於樣式表的位置。如果您在視圖/頁面中強制編碼風格,則它將與頁面的網址相關。因此,雖然請求yourSiteBaseUrl/有效,但即使這兩條路由返回相同的操作方法和視圖/頁面,yourSiteBaseUrl/Home/yourSiteBaseUrl/Home/Index也不會起作用,也不起作用。所以我建議不要那樣做。

將定義移動到css文件並在其中使用正確的相對路徑。它然後將工作yourSiteBaseUrl/Home/IndexyourSiteBaseUrl/HomeyourSiteBaseUrl

+0

感謝發表!之後有什麼意義 - '? – Michael

+0

您的意思是? – Shyju

+0

@Michael'.'表示當前文件夾,'..'表示父文件夾 –

0
votes
answers
71 views
+10

基於查詢字符串的返回對象

0

我想根據查詢字符串返回對象。
例如,我想api/users/{id}?fields=username,email,reputation返回僅包含三個包含屬性(用戶名,電子郵件,信譽)的User類型的對象。基於查詢字符串的返回對象

在附註中,默認情況下,在.NET Core中,逗號分隔的查詢字符串是不可能的。
Here's a tutorial on making that work

按照上面的指導,我有一個字符串列表。我如何創建一個只包含匹配這些字符串名稱的屬性的對象?
僅供弦數,我可以做到這一點(感謝本·霍爾):

List<string> listOfStrings ...; // Strings from query 
User user = GetUser(id); // User from db 

User newUser = new User(); 

if (listOfStrings.Contains("username")) 
    newUser.username = user.username; 
if (listOfStrings.Contains("email")) 
    newUser.email = user.email; 
if (listOfStrings.Contains("reputation")) 
    newUser.reputation = user.reputation; 

但對於字符串(我的用戶類有30多個屬性)我怎麼會去這樣做的一個長長的清單?

僅供參考Facebook Graph API是做這件事的。

+0

你的typeof(用戶)的'公共屬性_could_使用反射'只有複製這些領域'給'newUser'命名,但是...爲什麼?對於asp.net,只是不顯示任何來自'用戶'那不在查詢字符串... –

+0

你可以只返回一個具有這些proprties的匿名對象。 – CodingYoshi

+0

我在if語句放置中犯了錯誤lol –

沙发
0
0

Turns out there is actually Middleware for this called Popcorn.

Popcorn是一種基於RESTful API的通信協議,允許請求客戶端在檢索資源或資源集合時識別包含的資源的各個字段。

它允許遞歸選擇字段,允許將多個調用 壓縮成一個。

特點:

  • 選擇性包含從一個RESTful API
  • 配置響應默認
  • 排序響應
  • 選擇性授權和響應的應用權限值
  • 配置響應檢查員
  • 工廠和adva NCED投影支持
  • 設置相關的上下文爲您的API
  • 盲展開式爲f響應從`用戶對象
板凳
0
1

我們可以探索反射等其他方式,但if仍然應該足夠好。看起來你在嘗試在對象初始化程序中使用If時犯了一個簡單的錯誤。您必須在創建新的用戶對象後執行此操作,例如

User newUser = new User(); 
if (listOfStrings.Contains("username")) 
{ 
     newUser.username = user.username; 
} 
+0

如果我的潛在字符串列表很長,那麼最好如何處理? –

+2

進入思考領域。我談過[類似的事情](https://stackoverflow.com/questions/40041905/web-api-handle-misspelled-fromuri-parameters/40043835#40043835),但不完全是這個問題,不能說我有曾經使用[字符串名稱來訪問屬性](https://stackoverflow.com/questions/2905187/accessing-object-property-as-string-and-setting-its-value)。 –

地板
0
2
List<string> listOfStrings ...; // Strings from query 
User user = GetUser(id); // User from db 

User newUser = new User(); 
//gettting object type 
var userType = user.GetType(); 

該解決方案大約需要思考
一定的瞭解它使用的方法的GetValue和的SetValue
(代碼是在Visual Studio測試)在listOfStrings
現在的foreach元素

foreach(var propertyName in listOfString){ 
// This line of code retrives the value of the propety in the user class 
var retrivedValue = userType.GetProperty(propertyName).GetValue(user); 
// This line of code sets the value retrived to the property in the newUser class 
userType.GetProperty(propertyName).SetValue(newUser, retrivedValue , null); 
} 
+0

這工作,謝謝。儘管我的目標是匿名返回newUser對象(只包括查詢中給出的屬性)。這可能嗎? –

+0

本質上我想要做的是Facebook Graph API的功能。返回的JSON對象應該只包含查詢中指定的字段。 –

+0

我通過創建一個'IDictionary '來實現這一點,在foreach中檢查null並存儲爲'propertyName'鍵和'retreivedValue'值。然後我返回只包含給定的屬性並且不爲空的字典。這並沒有使用你上面寫的所有代碼,但是儘管如此仍然是有價值的。再次感謝您的幫助:) –

0
votes
answers
52 views
+10

什麼時候可以調用db.SaveChanges()兩次?

1

我有一個控制器,當我從AD獲取用戶證書並將其保存到Profiles表中時。我也想設置一些用戶首選項,但是,爲了做到這一點,我需要IdProfile我剛剛保存在Preference表中。什麼時候可以調用db.SaveChanges()兩次?

var Profile = new Profile 
{ 
    //Id is auto increment 
    EmpId = viewmodel.EmployeeId; 
    //.... 
}; 
db.Profiles.Add(Profile); 
db.SaveChanges(); 

偏好保存:

var user = User.Identity.Name; 
var getUser = (from gu in db.Profiles where user == gu.EmployeeId select gu.Id).Single(); 
var Preference = new Preference 
{ 
    UserId = getUser, 
    //... 
}; 
db.Preferences.Add(Preference); 
db.SaveChanges(); 

在這種情況下,這是可以接受的?

+0

是的,爲什麼不。但是,您也可以將配置文件分配給導航屬性('new Preference {User = profileWhichIsNotYetSaved}'),並且只調用一次。 – Evk

+0

這裏定義的是uc – Harry

+0

在你沒有進行批量操作和交易的任何時刻,它是可以接受的嗎 –

沙发
0
1

它看起來像你的變量getUser(請重命名這個變量)最終成爲新保存的配置文件ID ..雖然你沒有告訴我們你在哪裏定義uc。無論如何讓我告訴你實體框架的魔力。

var profile = new Profile 
{ 
    //Id is auto increment 
    EmpId = viewmodel.EmployeeId; 
    //.... 
}; 
var preference = new Preference 
{ 
    //... 
}; 

profile.Preferences.Add(preference;) 
db.Profiles.Add(profile); 
db.SaveChanges(); 

因此,您可以看到您不必要地使用了多個SaveChanges。有時您需要有多個SaveChanges。比如讓我們說你SaveChanges,發佈一個id到api,檢索一些值並保存更改。我從來沒有必要這樣做,但我有時候需要超過1次保存更改。例如,我必須將x數量的數據庫記錄(包括x個相關記錄)複製到循環中的新記錄中。

+0

'uc'是我修復它的錯字 – Skullomania

+0

skullomania你嘗試做我在這裏回答的問題嗎? – Harry

+0

我在preference.userId上得到了一個null引用。不是因爲它起初運作良好,所以我都很瞭解。 – Skullomania