2015-11-04 94 views
2

我对asp.net mvc相当陌生,而且我目前有一个显示大量错误的应用程序。我有2页包含应用程序错误和日志错误。数据来自2个不同的数据库,但我想要在一个页面上显示来自两个数据库的数据。在MVC中结合来自2个数据库的数据

这些表具有不同名称的标题,表示相同的东西,例如Application Database中的ApplicationName与Log Database中的LogName是一样的。

下面是我目前拥有的一个小例子,以及我想要的一个例子。

当前

Application Errors 

ID ApplicationName ApplicationMessage  ApplicationDate 

1 Something   Hello World   01/01/2015 
2 Something Else  Another Message  03/01/2015 


Log Errors 

ID LogName   LogMessage    LogDate 

1 Some Log   A log message   02/01/2015 
2 Another Log  Another Log Message 04/01/2015 

我想

Internal Errors 

ID Name    Message    Date 

1 Something   Hello World   01/01/2015 
2 Some Log   A log message   02/01/2015 
3 Something Else  Another Message  03/01/2015 
4 Another Log  Another Log Message 04/01/2015 

在分钟什么,我对每个数据库2个独立的模型,但我想我需要两个模型合并为一个模型结合他们两个,但我不确定如何做到这一点。我如何能够将两个数据源合并在一起以在同一页面中显示数据?

现有型号

应用

[Table("ELMAH_Error")] 
    public class ElmahError 
    { 
     [Key] 
     public System.Guid ErrorId { get; set; } 

     public System.String Application { get; set; } 
     public System.String Host { get; set; } 
     public System.String Type { get; set; } 
     public System.String Source { get; set; } 
     public System.String Message { get; set; } 
     public System.String User { get; set; } 
     public System.Int32 StatusCode { get; set; } 
     public System.DateTime TimeUtc { get; set; } 
     public System.Int32 Sequence { get; set; } 
     public System.String AllXml { get; set; } 
    } 

登录

[Table("LogEntry")] 
    public class LogEntry 
    { 
     [Key] 
     public Int64 ID { get; set; } 
     public DateTime LogDate { get; set; } 
     public Int16 Priority { get; set; } 
     public string SourceClass { get; set; } 
     public string Category { get; set; } 
     public string Message { get; set; } 
     public string UserID { get; set; } 
     public string ProcessID { get; set; } 
    } 

从模型中,有一些领域,我想合并,以及作为与我不相似的字段也喜欢包括。下面的模型显示了我想要的,但我不知道如何实现它。

内部错误

public class InternalErrors 
    { 

     public string Id { get; set; } //L:ID && E:ErrorId 
     public int Priority { get; set; } //L:Priority 
     public string Application { get; set; } //L:SourceClass && E:Application 
     public string Message { get; set; } //L:Message && E:Message 
     public string Type { get; set; } //L:Category && E:Type 
     public string User { get; set; } //L:UserID && E:User 
     public string ProcessID { get; set; } //L:ProcessID 
     public DateTime Date { get; set; } //L:LogDate && E:TimeUtc 
     public int StatusCode { get; set; } //E:StatusCode 
     public string AllXml { get; set; } //E:AllXml 
     public int Sequence { get; set; } //E:Sequence 
     public int ErrorCount { get; set; } //E:ErrorCount 
    } 

我希望这是足够的信息,为您提供一个答案,如果你有什么事,让我知道。

在此先感谢

+0

你在说这个https://dotnetfiddle.net/mrWGDn吗? –

+0

你用什么来连接数据库? EF,raw ado.net,它是什么?您可能还想将其添加为标签。 – gldraphael

回答

1

有许多方法可以将数据从模型提供给视图。 一个是ViewModel。它必须包含您想要发送以查看的数据。看看这个:

using System; 

public class ErrorViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 

    public string Message { get; set; } 

    public DateTime Date { get; set; } 
} 

而在控制器中,你需要创建一个这个ViewModel的列表,并填充你的数据。

1

可以使用linq

using System; 
using System.Linq; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     var elmahErrorList = new List<ElmahError>{ 
      new ElmahError{ ErrorId = Guid.NewGuid(), Application = "Something",Message = "Hello World" , TimeUtc = DateTime.Now }, 
       new ElmahError{ ErrorId = Guid.NewGuid(), Application = "Something Else",Message = "Another Message" , TimeUtc = DateTime.Now } 
     }; 

     var logEntryList = new List<LogEntry>{ 
      new LogEntry{ ID = 1, SourceClass = "Something",Message = "Hello World" , LogDate = DateTime.Now }, 
       new LogEntry{ ID = 1, SourceClass = "Something Else",Message = "Another Message" , LogDate = DateTime.Now } 
     }; 

     var internalErrorsList = new List<InternalErrors>(); 

     var elmahErrorListinternalErrorses = elmahErrorList.Select(e => new InternalErrors 
                    { 
                     Id = e.ErrorId.ToString(), 
                     Application = e.Application, 
                     Message = e.Message, 
                     Type = e.Type, 
                     User = e.User, 
                     Date = e.TimeUtc, 
                     StatusCode = e.StatusCode, 
                     AllXml = e.AllXml, 
                     Sequence = e.Sequence 
                    }); 

     internalErrorsList.AddRange(elmahErrorListinternalErrorses); 

     var elmahErrorListlogEntryLists = logEntryList.Select(l => new InternalErrors 
                   { 
                    Id = l.ID.ToString(), 
                    Priority = l.Priority, 
                    Application = l.SourceClass, 
                    Message = l.Message, 
                    Type = l.Category, 
                    User = l.UserID, 
                    Date = l.LogDate 
                   }); 
     internalErrorsList.AddRange(elmahErrorListlogEntryLists); 

     internalErrorsList.ForEach(f => 
            { 
             Console.Write(f.Id); Console.Write("\t"); 
             Console.Write(f.Application);Console.Write("\t"); 
             Console.Write(f.Message);Console.Write("\t"); 
             Console.Write(f.Date);Console.Write("\t"); 
             Console.WriteLine(); 
            }); 

    } 
    public class InternalErrors 
    { 
     public string Id { get; set; } //L:ID && E:ErrorId 
     public int Priority { get; set; } //L:Priority 
     public string Application { get; set; } //L:SourceClass && E:Application 
     public string Message { get; set; } //L:Message && E:Message 
     public string Type { get; set; } //L:Category && E:Type 
     public string User { get; set; } //L:UserID && E:User 
     public string ProcessID { get; set; } //L:ProcessID 
     public DateTime Date { get; set; } //L:LogDate && E:TimeUtc 
     public int StatusCode { get; set; } //E:StatusCode 
     public string AllXml { get; set; } //E:AllXml 
     public int Sequence { get; set; } //E:Sequence 
     public int ErrorCount { get; set; } //E:ErrorCount 
    } 
    public class ElmahError 
    { 
     public System.Guid ErrorId { get; set; } 
     public System.String Application { get; set; } 
     public System.String Host { get; set; } 
     public System.String Type { get; set; } 
     public System.String Source { get; set; } 
     public System.String Message { get; set; } 
     public System.String User { get; set; } 
     public System.Int32 StatusCode { get; set; } 
     public System.DateTime TimeUtc { get; set; } 
     public System.Int32 Sequence { get; set; } 
     public System.String AllXml { get; set; } 
    } 

    public class LogEntry 
    { 
     public Int64 ID { get; set; } 
     public DateTime LogDate { get; set; } 
     public Int16 Priority { get; set; } 
     public string SourceClass { get; set; } 
     public string Category { get; set; } 
     public string Message { get; set; } 
     public string UserID { get; set; } 
     public string ProcessID { get; set; } 
    } 
} 

演示:https://dotnetfiddle.net/mrWGDn

2

,如果你想这是什么

Internal Errors 

ID Name    Message    Date 

1 Something   Hello World   01/01/2015 
2 Some Log   A log message   02/01/2015 
3 Something Else  Another Message  03/01/2015 
4 Another Log  Another Log Message 04/01/2015 

然后创建一个类名InternalErrors如下。现在

public class InternalErrors 
{ 
     public int ID; 
     public string Name; 
     public string Message; 
     public DateTime Date; 
} 

您可以按如下方式从应用程序错误中获取数据,并记录错误,并在其上执行联合编写LINQ查询。

var AppErrors=from AE in _db.ApplicationErrors select AE; 
var LogErrors=from LE in _dc.LogErrors select LE; 
var internerrors=AppErrors.Union(LogErrors); 
var InternalErrors=(from ie in internerrors select new InternalErrors() 
         { 
          ID=ie.ID, 
          Message=ie.ApplicationMessage, 
          Name=ie.ApplicationName, 
          Date=ie.ApplicationDate 
         }).ToList(); 
2

MRebati的viewmodel方法是最好的解决方案。

我经常发现它有用有一个基类,不同的实现:

public abstract class ErrorViewModel 
{ 

    public abstract int Id { get; } 

    public abstract string Name { get; } 
} 

public class ElmahErrorViewModel 
{ 
    public ElmahErrorViewModel(ElmahError instance) 
    { 
     this.Instance = instance; 
    } 

    public ElmahError Instance { get; private set; } 

    public int Id { get { return Instance.ErrorId; } } 

    public string Name { get { return instance.Appication; } } 
} 

这样你可以创建一个List<ErrorViewModel>

var items = from e in context.ElmahErrors 
      select new ElmahErrorViewModel(e); 

list.AddRange(items); 

var items2 = from l in context.LogEntrys 
      select new LogEntryViewModel(l); 

list.AddRange(items2); 

添加条目,这是非常有用的,因为你躲细节,但你仍然可以分开列表并访问基本对象

var elmahErrors = items.OfType<ElmahErrorViewModel>().Select(x => x.Instance); 
相关问题