簡體   English   中英

LINQ代碼結合兩個數據庫表?

[英]LINQ code to combine two database tables?

所以我有一個表,我在一個網站上顯示,通過一些LINQ代碼從數據庫獲取所有信息。 “db.Log”包含一些內容和一個外鍵customerId ,它鏈接到名為dbo.customers的數據庫中的Id (它只有Id和customerName) ,我希望LINQ代碼將這兩者結合起來,所以我除非你全部知道,否則可以在表格中填寫客戶的姓名,而不是真正說不出任何內容的ID。 以下是當前代碼:

LogModelsController.cs

message = (from log 
           in db.Log 
           select log);

int pageSize = 10;
int pageNumber = (page ?? 1);

return View(message.OrderByDescending(i => i.timeStamp).ToPagedList(pageNumber, pageSize));

LogModel.cs

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ASDMVC.Models
{
    [Table("Log")]
    public class LogModel
    {
        [Key]
        public long id { get; set; }
        public string message { get; set; }
        public DateTime timeStamp { get; set; }
        public string level { get; set; }
        public int customerId { get; set; }
    }

    public class LogDBContext:DbContext
    {
        public LogDBContext() : base("MySqlConnection")
        {

        }

        public DbSet <LogModel> Log { get; set; }

    }
}

我對LINQ代碼很新,請原諒我,任何幫助都將不勝感激。

提前致謝。

編輯:NewCustomerModel.cs

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Web.Mvc;

namespace ASDMVC.Models
{
    [Table("Customers")]
    public class NewCustomerModel
    {
        [Key]
        public int Id { get; set; }
        [Display(Name = "Customer Id")]
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
    }

    public class CustomerDBContext : DbContext
    {
        public CustomerDBContext() : base("MySqlConnection")
        {

        }
        public DbSet<NewCustomerModel> Customers { get; set; }
    }
}

我認為(在與朋友交談后)需要這種模式 - 可能完全錯誤。


用戶1666620建議后的代碼

LogModelsController.cs

message = (from log in db.Log join customers in dbo.Customers on log.customerId equals customers.Id select log);

int pageSize = 10;
int pageNumber = (page ?? 1);

return View(message.OrderByDescending(i => i.timeStamp).ToPagedList(pageNumber, pageSize));

LogModel.cs

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ASDMVC.Models
{
    [Table("Log")]
    public class LogModel
    {
        [Key]
        public long id { get; set; }
        public string message { get; set; }
        public DateTime timeStamp { get; set; }
        public string level { get; set; }
        public int customerId { get; set; }
        public int customerName { get; set; }
    }

    public class LogDBContext:DbContext
    {
        public LogDBContext() : base("MySqlConnection")
        {

        }

        public DbSet <LogModel> Log { get; set; }

    }
}

有錯誤:

指定的LINQ表達式包含對與不同上下文關聯的查詢的引用。

這應該為你做:

var message = (from log in db.Log
               join customers in dbo.customers on log.customerid equals customers.Id
               select log); 

在上面,沒有必要明確使用where子句,因為在連接中處理。

如果您只想返回特定列,可以執行以下操作:

var message = (from log in db.Log
               join customers in dbo.customers on log.customerid equals customers.Id
               select new { customerId = customers.Id, logId = log.id }); 

如果你想在兩個上下文之間進行連接,請看一下這個解決方法: 模擬交叉上下文連接 - LINQ / C#

控制器:

message = db.GetLogs();

int pageSize = 10;
int pageNumber = (page ?? 1);
var logs = message.OrderByDescending(i => i.timeStamp).ToPagedList(pageNumber, pageSize);

foreach (var log in logs)
    log.Name = Customer.Where(a => a.Value == log.customerId.ToString()).FirstOrDefault().Text;
                return PartialView("_LogPartialLayout", logs);

模型:

using System;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Collections.Generic;
using System.Web.Mvc;

namespace ASDMVC.Models
{
    [Table("Log")]
    public class LogModel
    {
        [Key]
        public long id { get; set; }
        public string message { get; set; }
        public DateTime timeStamp { get; set; }
        public string level { get; set; }
        public int customerId { get; set; }
        [NotMapped]
        public string Name { get; set; }
    }

    public class LogDBContext:DbContext
    {
        public LogDBContext() : base("MySqlConnection")
        {

        }

        public DbSet <LogModel> Log { get; set; }

        public IQueryable<LogModel> GetLogs()
        {
            return from log in Log
                   select log;
        }
    }
}

暫無
暫無

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

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