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

У меня есть две таблицы, PostOne и PostEig, в 1-M.

  • PostOne - это основная таблица, содержащая информацию об отдельной задаче.
  • PostEig - это таблица пользователей, которым назначена задача в Post One.

Модели [упрощенные]

public class PostOne
{
    public string One { get; set; }
    [Key]
    public string Two { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MMM-yyyy}", ApplyFormatInEditMode = true)]
    public DateTime ThrD { get; set; }
}

public class PostEig
{
    public string EigOne { get; set; }
    public string EigTwo { get; set; } //foreign key
    [Key]
    public string EigID { get; set; }
    [Required]
    public string EigA { get; set; }  //user login 
}

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

  1. вызвать список PostEigs, где EigA == User.Identity.Name
  2. и из этого списка .. вызвать список PostOnes Где Два == EigTwo
  3. и из этого списка .. вызвать список PostOnes Где ThrD == DateTime.UtcNow.Date

Я пробовал что-то вроде этого:

public ActionResult SkedList()
{
    return View(db.PostEigs.Where(m =>
            m.EigA == User.Identity.Name ||
            m.EigTwo == db.PostOnes.Where(o => o.ThrD == DateTime.UtcNow.Date)
            ).ToList());
}

Если это непонятно, дайте мне знать. Я ценю любые советы или решения, даже если они в другом направлении.

-1
Nick Fleetwood 6 Янв 2014 в 06:10

1 ответ

Лучший ответ

Похоже, это кандидат на роль Inner Join. Я считаю, что гораздо проще думать в терминах SQL, а затем преобразовывать его в LINQ.

SQL-запрос:

SELECT 
    po.* 
FROM 
    PostOnes po
INNER JOIN 
    PostEig pe
ON 
    pe.EigTwo = po.Two
WHERE 
    pe.EigA = AUTH_NAME AND po.ThrD = TODAY()

Запрос C # LINQ:

var DB_PostEig = new List<PostEig>()
{
    new PostEig(){EigTwo = "Foo1", EigA =  "Foo"},
    new PostEig(){EigTwo = "Foo2", EigA =  "Foo"},
    new PostEig(){EigTwo = "Bar1", EigA =  "Bar"},
    new PostEig(){EigTwo = "Bar2", EigA =  "Bar"}
};

var DB_PostOnes = new List<PostOne>()
{
    new PostOne(){Two = "Foo1", ThrD = new DateTime(1900,1,1)},
    new PostOne(){Two = "Foo2", ThrD = new DateTime(2000,1,1)},
    new PostOne(){Two = "Foo3", ThrD = new DateTime(1900,1,1)},
    new PostOne(){Two = "Bar1", ThrD = new DateTime(1900,1,1)},
    new PostOne(){Two = "Bar2", ThrD = new DateTime(1900,1,1)}
};

var authName = "Foo";
var currentDate = new DateTime(1900,1,1);

//Not sure if this is the most optimal LINQ Query, but it seems to work.
var queryReturn = DB_PostOnes.Join(DB_PostEig.Where(x => x.EigA == authName), x => x.Two, y => y.EigTwo, (x, y) => x)
    .Where(z => z.ThrD == currentDate)
    .ToList();

queryReturn.ForEach(x => Console.WriteLine(x.Two + " - " + x.ThrD)); //Foo1 - 1/1/1900

Редактировать:

LINQ Query без соединения

var queryTwo = DB_PostOnes
    .Where(x => DB_PostEig.Any(y => y.EigTwo == x.Two && y.EigA == authName) && x.ThrD == currentDate)
    .ToList();
0
Xenolightning 7 Янв 2014 в 01:54
1) почему в данных var eig и var у вас есть несколько экземпляров postone и posteig? Разве не было бы по одному? 2) почему там «eigtwo» и «two»? Я не понимаю, как они относятся друг к другу. Их стоимость не будет определена позже ... ?? Я немного запутался в вашем решении, но в нем есть смысл
 – 
Nick Fleetwood
6 Янв 2014 в 09:08
У меня нет доступа к вашей базе данных, поэтому я создал «фальшивую» базу данных в памяти для хранения некоторых данных, которые я мог бы запросить. Я обновил свои соглашения об именах, чтобы, надеюсь, улучшить читаемость.
 – 
Xenolightning
7 Янв 2014 в 01:53