Material2 Datepicker - конвертировать дату в временную метку без времени [дубликат]

Невозможно создать отношения «многие ко многим» с персонализированной таблицей соединений. В отношениях «многие ко многим» EF управляет таблицей соединений внутри и снаружи. Это таблица без класса Entity в вашей модели. Чтобы работать с такой таблицей соединений с дополнительными свойствами, вам нужно будет создать фактически два отношения «один ко многим». Это может выглядеть так:

public class Member
{
    public int MemberID { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }

    public virtual ICollection<MemberComment> MemberComments { get; set; }
}

public class Comment
{
    public int CommentID { get; set; }
    public string Message { get; set; }

    public virtual ICollection<MemberComment> MemberComments { get; set; }
}

public class MemberComment
{
    [Key, Column(Order = 0)]
    public int MemberID { get; set; }
    [Key, Column(Order = 1)]
    public int CommentID { get; set; }

    public virtual Member Member { get; set; }
    public virtual Comment Comment { get; set; }

    public int Something { get; set; }
    public string SomethingElse { get; set; }
}

Если теперь вы хотите найти все комментарии членов с LastName = «Смит», например, вы можете написать такой запрос:

var commentsOfMembers = context.Members
    .Where(m => m.LastName == "Smith")
    .SelectMany(m => m.MemberComments.Select(mc => mc.Comment))
    .ToList();

... или ...

var commentsOfMembers = context.MemberComments
    .Where(mc => mc.Member.LastName == "Smith")
    .Select(mc => mc.Comment)
    .ToList();

Или создать список членов с именем «Смит» (мы предполагаем, что их более одного) вместе с их комментариями вы можете использовать project:

var membersWithComments = context.Members
    .Where(m => m.LastName == "Smith")
    .Select(m => new
    {
        Member = m,
        Comments = m.MemberComments.Select(mc => mc.Comment)
    })
    .ToList();

Если вы хотите найти все комментарии члена с MemberId = 1:

var commentsOfMember = context.MemberComments
    .Where(mc => mc.MemberId == 1)
    .Select(mc => mc.Comment)
    .ToList();

Теперь вы также можете фильтровать по свойствам в вашем соединении table (что было бы невозможно во многих отношениях), например: Отфильтровать все комментарии элемента 1, которые имеют свойство 99 в Something:

var filteredCommentsOfMember = context.MemberComments
    .Where(mc => mc.MemberId == 1 && mc.Something == 99)
    .Select(mc => mc.Comment)
    .ToList();

Из-за ленивой загрузки все может стать проще. Если у вас есть загруженный Member, вы можете получить комментарии без эксплицитного запроса:

var commentsOfMember = member.MemberComments.Select(mc => mc.Comment);

Я полагаю, что ленивая загрузка будет автоматически получать комментарии за кулисами.

Изменить

Просто для удовольствия еще несколько примеров, как добавить сущности и отношения и как их удалить в этой модели:

1) Создайте один участник и два комментария этого участника :

var member1 = new Member { FirstName = "Pete" };
var comment1 = new Comment { Message = "Good morning!" };
var comment2 = new Comment { Message = "Good evening!" };
var memberComment1 = new MemberComment { Member = member1, Comment = comment1,
                                         Something = 101 };
var memberComment2 = new MemberComment { Member = member1, Comment = comment2,
                                         Something = 102 };

context.MemberComments.Add(memberComment1); // will also add member1 and comment1
context.MemberComments.Add(memberComment2); // will also add comment2

context.SaveChanges();

2) Добавить третий комментарий участника1:

var member1 = context.Members.Where(m => m.FirstName == "Pete")
    .SingleOrDefault();
if (member1 != null)
{
    var comment3 = new Comment { Message = "Good night!" };
    var memberComment3 = new MemberComment { Member = member1,
                                             Comment = comment3,
                                             Something = 103 };

    context.MemberComments.Add(memberComment3); // will also add comment3
    context.SaveChanges();
}

3) Создать новый член и связать его с существующим комментарием2:

var comment2 = context.Comments.Where(c => c.Message == "Good evening!")
    .SingleOrDefault();
if (comment2 != null)
{
    var member2 = new Member { FirstName = "Paul" };
    var memberComment4 = new MemberComment { Member = member2,
                                             Comment = comment2,
                                             Something = 201 };

    context.MemberComments.Add(memberComment4);
    context.SaveChanges();
}

4) Создайте связь между существующим элементом2 и комментарием 3:

var member2 = context.Members.Where(m => m.FirstName == "Paul")
    .SingleOrDefault();
var comment3 = context.Comments.Where(c => c.Message == "Good night!")
    .SingleOrDefault();
if (member2 != null && comment3 != null)
{
    var memberComment5 = new MemberComment { Member = member2,
                                             Comment = comment3,
                                             Something = 202 };

    context.MemberComments.Add(memberComment5);
    context.SaveChanges();
}

5) Удалите это отношение еще раз:

var memberComment5 = context.MemberComments
    .Where(mc => mc.Member.FirstName == "Paul"
        && mc.Comment.Message == "Good night!")
    .SingleOrDefault();
if (memberComment5 != null)
{
    context.MemberComments.Remove(memberComment5);
    context.SaveChanges();
}

6) Удалите член1 и все его отношения к Комментарии:

var member1 = context.Members.Where(m => m.FirstName == "Pete")
    .SingleOrDefault();
if (member1 != null)
{
    context.Members.Remove(member1);
    context.SaveChanges();
}

Это также удаляет отношения в MemberComments, потому что отношения «один ко многим» между Member и MemberComments и между Comment и MemberComments настроены с каскадным удалить по соглашению. И это происходит потому, что MemberId и CommentId в MemberComment обнаружены как свойства внешнего ключа для свойств навигации Member и Comment, и поскольку свойства FK имеют тип, не имеющий значения null int, отношение , который, наконец, вызывает каскадное удаление-установку. Я думаю, что имеет смысл в этой модели.

49
задан Eric J. 6 May 2012 в 00:12
поделиться

6 ответов

Попробуйте

var date = new Date("11/21/1987 16:00:00"); // some mock date
var milliseconds = date.getTime(); 
// This will return you the number of milliseconds
// elapsed from January 1, 1970 
// if your date is less than that date, the value will be negative

EDIT

Вы предоставили дату ISO. Он также принимается конструктором объекта Date

var myDate = new Date("2012-02-10T13:19:11+0000");
var result = myDate.getTime();

Edit

. Лучшее, что я нашел, - это избавиться от смещение вручную.

var myDate = new Date("2012-02-10T13:19:11+0000");
var offset = myDate.getTimezoneOffset() * 60 * 1000;

var withOffset = myDate.getTime();
var withoutOffset = withOffset - offset;
alert(withOffset);
alert(withoutOffset);

Кажется, работает. Что касается проблем с преобразованием строки ISO в объект Date, вы можете обратиться к предоставленным ссылкам.

EDIT

Исправлена ​​ошибка с неправильным преобразованием до миллисекунд в соответствии с комментарием Прасад19сары.

73
ответ дан Oybek 19 August 2018 в 13:44
поделиться

Другим решением может быть использование парсера Number Number следующим образом:

let result = Number(new Date("2012-02-10T13:19:11+0000"));
let resultWithGetTime = (new Date("2012-02-10T13:19:11+0000")).getTime();
console.log(result);
console.log(resultWithGetTime);

Он преобразуется в миллисекунды точно так же, как getTime() в Date объект

0
ответ дан Black Mamba 19 August 2018 в 13:44
поделиться

Другим возможным решением является сравнение текущей даты с January 1, 1970, вы можете получить January 1, 1970 на new Date(0);

var date = new Date(); 
var myDate= date - new Date(0);
2
ответ дан Haris 19 August 2018 в 13:44
поделиться

Другой вариант с 2017 года - использовать Date.parse(). Документация MDN указывает, однако, что она ненадежна до ES5.

var date = new Date(); // today's date and time in ISO format
var myDate = Date.parse(date);

Подробнее см. скрипт .

3
ответ дан samurai_jane 19 August 2018 в 13:44
поделиться

Сокращение предыдущих решений -

var myDate = +new Date("2012-02-10T13:19:11+0000");

Он выполняет преобразование типа «на лету» и напрямую выводит дату в миллисекундах.

Другой способ также использует метод parse метода Date, который выводит время EPOCH в миллисекундах.

var myDate = Date.parse("2012-02-10T13:19:11+0000");
20
ответ дан Tahsin Turkoz 19 August 2018 в 13:44
поделиться
  • 1
    У вас там небольшая опечатка, + – Stuart Siegler 16 September 2015 в 01:01
  • 2
    @ stuart-siegler На самом деле нет опечаток, «+» возвращает дату в миллисекундах. – LordTribual 18 November 2015 в 11:40
  • 3
    @LordTribual & quot; + new & quot; возвращает дату в миллисекундах? – Stuart Siegler 18 November 2015 в 13:41
  • 4
    @ stuart-siegler Не специально «+ новый» но "+" делает трюк и является сокращением, так сказать. Например, +new Date() возвращает 1447857230137, который является временем в миллисекундах. – LordTribual 18 November 2015 в 15:34
  • 5
    Гораздо яснее явно построить объект JavaScript Number: const dateMillis = Number(new Date('2017-09-26T20:24:18.801Z')), но new Date('2017-09-26T20:24:18.801Z').getTime() или new Date('2017-09-26T20:24:18.801Z').valueOf() является еще более читаемым. – David G 26 September 2017 в 22:27
-1
ответ дан Pedram Rastegar 31 October 2018 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: