Manas m@ster Ответов: 1

Как я могу применить внешнее соединение с помощью LINQ в mvc. Внутреннее соединение работает, но внешнее соединение дает следующую ошибку..почему?


эта ошибка приближается..Может ли кто-нибудь попытаться ее решить?

An exception of type 'System.NullReferenceException' occurred in App_Web_linqquery.cshtml.a8d08dba.0r5s74cf.dll but was not handled in user code<br />
<br />
Additional information: Object reference not set to an instance of an object.


Что я уже пробовал:

namespace WebApplication4Linq.Models
{
    public class Employee
    {
        [Key]
        public int EmpId { get; set; }
        public string EmpName { get; set; }
        public string EmpCode { get; set; }
        public string DeptId { get; set; }

        public static List<employee> GetEmployees()
        {
            List<employee> employees = new List<employee>();
            employees.Add(new Employee { EmpId = 1, EmpName = "Shyam", EmpCode = "AAA", DeptId = "D01" });
            employees.Add(new Employee { EmpId = 2, EmpName = "Raja", EmpCode = "BBB", DeptId = "D03" });
            employees.Add(new Employee { EmpId = 3, EmpName = "Hari", EmpCode = "CCC", DeptId = "D04" });
            employees.Add(new Employee { EmpId = 4, EmpName = "Krushna", EmpCode = "DDD", DeptId = "D03" });
            employees.Add(new Employee { EmpId = 5, EmpName = "Mohan", EmpCode = "EEE", DeptId = "D02" });

            return employees;
        }
    }

}

--------------
namespace WebApplication4Linq.Models
{
    public class Department
    {
        [Key]
       
        public string DeptName { get; set; }
        public string DeptCode { get; set; }
        public string DeptId { get; set; }

        public static List<department> GetDepts()
        {
            List<department> depts = new List<department>();
            depts.Add(new Department { DeptName = "CS", DeptCode = "ZZ", DeptId = "D01" });
            depts.Add(new Department {  DeptName = "EEE", DeptCode = "XX", DeptId = "D02" });
            depts.Add(new Department {  DeptName = "MCA", DeptCode = "YY", DeptId = "D03" });

            return depts;
        }
    }
}

-----------------------модель представления=----------
namespace WebApplication4Linq.Models
{
    public class ViewModel
    {
        public Employee employees { get; set; }
        public Department depts { get; set; }
    }
}
-------------Controller---------------------
  public class HomeController : Controller
    {
        public ActionResult LinqQuery()
        {
            ViewModel mymodel = new ViewModel();

            List<employee> emps = Employee.GetEmployees();
            List<department> dept = Department.GetDepts();

            var outerjoin = (from empn in emps
                             join den in dept
                             on empn.DeptId equals den.DeptId
                             into abc
                             from den in abc.DefaultIfEmpty()
                             select new ViewModel()
                             {
                                 
                                 employees = empn,
                                 depts = den
                             });
            return View(outerjoin);

-------------------(.cshtml)------------------
@model IEnumerable<webapplication4linq.models.viewmodel>

@using (Html.BeginForm())
{
        <h2>Index Page</h2>

        <hr />
        <h2>Employee Data</h2><hr />
        <table>
            <tr>
                
                <th>EmpName</th>
                <th>EmpCode</th>
                <th>DeptName</th>
                <th>DeptCode</th>
            </tr>
            @foreach(var emp in Model)
            {
                <tr>
                    
                    <td>@emp.employees.EmpName</td>
                    <td>@emp.employees.EmpCode</td>
                    <td>@emp.depts.DeptName</td>
                    <td>@emp.depts.DeptCode</td>
                </tr>
            }
        </table>
}

1 Ответов

Рейтинг:
1

David_Wimbley

Проблема заключается в том, что вы делаете левое соединение на своей таблице, поэтому вы включаете все записи на левой стороне вашего соединения независимо от того, есть ли совпадение. Я написал следующий sql очень быстро. Обратите внимание, как сотрудник D04 Hari предоставляет нулевую информацию для отдела. Именно поэтому вы получаете исключение нулевой ссылки.

DECLARE @Empoyees TABLE (
	EmpId int PRIMARY KEY NOT NULL,
	DeptId VARCHAR(10) NULL,
	EmpName VARCHAR(25) NULL
);


DECLARE @Department TABLE (
	DeptName VARCHAR(10) PRIMARY KEY NOT NULL,
	DeptId VARCHAR(10) NULL,
	DeptCode VARCHAR(25) NULL
);


INSERT INTO @Empoyees (EmpId, DeptId, EmpName) VALUES (1,'D01', 'Shyam')
INSERT INTO @Empoyees (EmpId, DeptId, EmpName) VALUES (2,'D03', 'Raja')
INSERT INTO @Empoyees (EmpId, DeptId, EmpName) VALUES (3,'D04', 'Hari')
INSERT INTO @Empoyees (EmpId, DeptId, EmpName) VALUES (4,'D03', 'Krushna')
INSERT INTO @Empoyees (EmpId, DeptId, EmpName) VALUES (5,'D02', 'Mohan')

INSERT INTO @Department ( DeptName, DeptId, DeptCode ) VALUES ('CS','D01','ZZ')
INSERT INTO @Department ( DeptName, DeptId, DeptCode ) VALUES ('EEE','D02','XX')
INSERT INTO @Department ( DeptName, DeptId, DeptCode ) VALUES ('MCA','D03','YY')


SELECT * FROM @Empoyees AS A
LEFT JOIN @Department AS B ON B.DeptId = A.DeptId


Этот запрос предоставляет пример вывода (я уверен ,что он не будет хорошо отображаться)

EmpId	DeptId	EmpName	DeptName	DeptId	DeptCode
1	D01	Shyam	CS	D01	ZZ
2	D03	Raja	MCA	D03	YY
3	D04	Hari	NULL	NULL	NULL
4	D03	Krushna	MCA	D03	YY
5	D02	Mohan	EEE	D02	XX




Поскольку я не уверен, что вы хотите отобразить, чтобы просто пройти мимо этой нулевой ссылки, вы можете проверить, если
depts
является нулевым до доступа к этим значениям, чтобы предотвратить исключение, или вы можете включить предложение where в цикл foreach, чтобы не включать depts == null

foreach (var item in outerjoin.Where(m=>m.depts != null))
            {
                counter += 1;

                Console.WriteLine("counter: " + counter);
                Console.WriteLine(item.employees.EmpName);
                Console.WriteLine(item.employees.EmpCode);
                Console.WriteLine(item.depts.DeptName);
                Console.WriteLine(item.depts.DeptCode);
            }