Member 13168476 Ответов: 1

Как сравнить два списка и вернуть 3 категоризированных списка


у меня ЕСТЬ Буксировочные списки с одинаковыми свойствами, и я хочу сравнить данные между старой и новой БД

List<srsEmployee> srsEmps = db.srsEmployees.ToList(); //from old DB
    List<destEmployee> destEmps = db2.destEmployees.ToList(); //from new DBs


мне нужно три списка показанных в представлении
1.Недавно Добавленный Сотрудник
2.Удаленный Сотрудник
3.Обыкновенный Сотрудник
так кто-нибудь может мне помочь ?

это то что я написал но результат не тот

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

    var Common = destEmps.Where(n => srsEmps.Any(o => o.EmpCode == n.EmpCode)).ToList();
    var Deleted = srsEmps.Where(o => !destEmps.Any(n => n.EmpCode == o.EmpCode)).ToList();
    var NewlyAdded = destEmps.Where(n => !srsEmps.Any(o => o.EmpCode == n.EmpCode)).ToList();
<pre>

Richard Deeming

Что - это неправильно" значит?

Помните, что мы не можем видеть ваш экран, получить доступ к вашей базе данных или прочитать ваши мысли. Все, с чем мы должны работать, - это то, что Вы нам скажете. Поэтому помогите нам помочь вам, рассказав нам то, что нам нужно знать. :)

1 Ответов

Рейтинг:
8

MadMyche

Я не претендую на то, чтобы быть адептом LINQ, но действительно дал ему шанс с этим доказательством концепции, и он работает так, как я хотел бы.

Это не 100% решение для вас, как есть, но должно быть хорошей базой для работы.

namespace ProofOfConcept {
	public class Employee {
		public int EmpCode { get; set; }
		public string EmpName { get; set; }

		public Employee() { }
		public Employee(int Code, string Name) {
			EmpCode = Code;
			EmpName = Name;
		}
	}

	class Program {
		static void Main(string[] args) {

			List<Employee> srsEmps = new List<Employee>();
				srsEmps.Add(new Employee(1, "Me"));
				srsEmps.Add(new Employee(2, "You"));

			List<Employee> destEmps = new List<Employee>();
				destEmps.Add(new Employee(2, "You"));
				destEmps.Add(new Employee(3, "Someone Else"));

			var Deleted =
				from s in srsEmps
				where !(from d in destEmps select d.EmpCode).Contains(s.EmpCode)
				select s;

			var Common =
				from s in srsEmps
				where (from d in destEmps select d.EmpCode).Contains(s.EmpCode)
				select s;

			var NewlyAdded =
				from d in destEmps
				where !(from s in srsEmps select s.EmpCode).Contains(d.EmpCode)
				select d;

			foreach (Employee d in Deleted) {
				Console.WriteLine("Deleted = " + d.EmpName);
			}
			foreach (Employee c in Common) {
				Console.WriteLine("Common = " + c.EmpName);
			}
			foreach (Employee n in NewlyAdded) {
				Console.WriteLine("New = " + n.EmpName);
			}

			Console.WriteLine("Press any key to continue");
			Console.ReadLine();
		}
	}
}


Member 13168476

это работает ! Спасибо
так что если у меня есть в моем контроллере
ViewBag.common = общий;
ViewBag.deleted = удален;
Видовой мешок.newlyAdded = NewlyAdded;

и на мой взгляд покажите результат в таблице вот так
@HTML-код.DisplayNameFor(модель =&ГТ; модель.Название)
@по каждому элементу (ВАР продукт в ViewBag.общие)
{
}
@HTML-код.DisplayNameFor(модель =&ГТ; модель.Название)

@Html.DisplayFor(modelItem =>item)


Как я могу показать сотруднику только имя, а не все его данные? потому что элемент не имеет никакого свойства для выбора

MadMyche

Возможно, вам придется сделать приведение/преобразование, чтобы иметь правильный набор объектов, а затем вы можете просто использовать @Html.DisplayFor(model => model.Name).
Я сам, вероятно, создал бы "модель сравнения сотрудников", которая имела бы 3 отдельных списка в качестве свойств, и передал бы эту модель в представление. Облегчать

Member 13168476

извините, но если я хочу знать, обновляется ли какой-либо сотрудник и какие поля отличаются
как я пишу запрос ?
ВАР обновление = ....

MadMyche

Не зная, какие поля находятся в базе данных и классе, я не смогу помочь вам найти обновленную информацию

Member 13168476

публичный класс srsEmployee
{
public int Id { get; set; }
public string Name { get; set; }
публичная строка EmpCode { get; set; }
public Nullable<decimal> зарплата { get; set; }
общественного значения null&ЛТ;система.датавремя&ГТ; начальная дата { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; БПК { получить; набор; }
public int DepartmentId { get; set; }
public bool Active { get; set; }

публичный виртуальный srsDepartment srsDepartment { get; set; }
}


публичный класс destEmployee
{
public int Id { get; set; }
public string Name { get; set; }
публичная строка EmpCode { get; set; }
public Nullable<decimal> зарплата { get; set; }
общественного значения null&ЛТ;система.датавремя&ГТ; начальная дата { получить; набор; }
общественного значения null&ЛТ;система.датавремя&ГТ; БПК { получить; набор; }
public int DepartmentId { get; set; }
public bool Active { get; set; }

публичный виртуальный destDepartment destDepartment { get; set; }
}