2014-09-16 3 views
1

두 개의 목록으로 데이터베이스를 시드하려고합니다. 첫 번째 목록은 여러 항목에 불과합니다. 두 번째 목록은 첫 번째 목록을 참조하는 정크입니다. 내가 LINQ를 통해 쓰레기의 두 번째 목록에서 첫 번째 목록에서 항목을 참조하기 위해 노력하고있어,하지만 난 내가 바로 그 일을하고 있지 않다 확신한다 : 예를 들어LINQ를 사용하여 날짜와 datetime을 비교하는 방법은 무엇입니까?

, 목록 1 :

var items = new List<Item>() 
{ 
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Cheese" }, 
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Lettuce" }, 
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 05, 12, 30, 30), Text = "Ground Beef" }, 
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 03, 12, 30, 30), Text = "Ketchup" }, 
    new Item { ItemtId = 1, DateTime = new DateTime(2014, 09, 03, 12, 30, 30), Text = "Mustard" }, 
}; 

var junk= new List<Junk>() 
{ 
    new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 05).ToShortDateString()}, 
    new Junk { JunkId = 2, DateTime = new DateTime(2014, 09, 03, 11, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 03).ToShortDateString()} 
}; 

이것은 나에게 답이되어야하는 것처럼 보입니다. 왜냐하면 나는 단지 시간이 아닌 데이트에만 관심이 있기 때문입니다. 그러나 이런 식으로 씨를 뿌리지는 않습니다. 오류가 발생합니다 :

LINQ to Entities does not recognize the method 'System.String ToShortDateString()' method, and this method cannot be translated into a store expression.

더 나은 솔루션을 구축하는 방법에 대한 의견이 있으십니까?

UPDATE

내가 사이트에 정확하게 내 코드를 전사하고, 내 문제를 발견 결국하지 않은 것 같은데. 내 원래의 코드에서

, 내가했다 :

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = context.Items.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05) } 

내가 가진해야 할 때

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05) } 

I가() .ToShortDateString 불필요하게

+0

그것은'.ToShortDateString()' –

답변

2

변경 필터를 유혹하고 있었다 :

.Where(d => d.DateTime.Date == new DateTime(2014, 09, 05)) 
1

TruncateTime 기능을 EntityFunctions 클래스로 사용할 수 있습니다.

new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => EntityFunctions.TruncateTime(d.DateTime) == EntityFunctions.TruncateTime(new DateTime(2014, 09, 05))} 

참고 : EntityFramework 6을 사용하는 경우 다음은 EntityFramework.dll에서 System.Data.Entity.DbFunctions.TruncateTime (...) 메소드이어야한다.

1

하위 쿼리 (Items = Junk 변수의 일부)는 목록이 아니라 열거 형이므로 열거 될 때까지 구체화되지 않으며 사용하기 전까지는 열거되지 않습니다. 엔터티 쿼리에 linq.

당신은 같은 그것을 변경하는 경우 : 당신이 놓친처럼

var junk= new List<Junk>() 
{ 
    new Junk { JunkId = 1, DateTime = new DateTime(2014, 09, 05, 10, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 05).ToShortDateString()).ToList()}, // this one will work as it gets materialized right now, not later, so by the time you pass it to linq to entities later it will already be a simple list of diferences, it won't try to compute "toshortdatestring" later, that will already be done 
    new Junk { JunkId = 2, DateTime = new DateTime(2014, 09, 03, 11, 00, 00), Items = items.Where(d => d.DateTime.ToShortDateString() == new DateTime(2014, 09, 03).ToShortDateString()} 
}; 
+0

좋은 시점 이후 ')'보인다. 나는이 부분 밖에서 그 부분을 움직여야 할 것이다. – CIA

관련 문제