В нашем коде C # я недавно изменил строку из запроса linq-to-sql select new
следующим образом:
OrderDate = (p.OrderDate.HasValue ?
p.OrderDate.Value.Year.ToString() + "-" +
p.OrderDate.Value.Month.ToString() + "-" +
p.OrderDate.Value.Day.ToString() : "")
Кому:
OrderDate = (p.OrderDate.HasValue ?
p.OrderDate.Value.ToString("yyyy-mm-dd") : "")
Изменение делает линию меньше и чище. Он также отлично работает с нашей базой данных SQL 2008 в нашей среде разработки. Однако, когда код был развернут в нашей производственной среде, использующей SQL 2005, я получил исключение: Nullable Type must have a value
. Для дальнейшего анализа я скопировал (p.OrderDate.HasValue ? p.OrderDate.Value.ToString("yyyy-mm-dd") : "")
в строку (вне оператора Linq), и у меня не было никаких проблем, так что это только вызывает проблему внутри моего Linq. Эта проблема как-то связана с SQL 2005, использующим другие форматы даты, чем с SQL 2008?
Вот еще Линк:
var FilteredOrders = [linq-to-sql query].AsEnumerable().ToList<Order>();
dt = FilteredOrders.Where(x => x != null).Select(p =>
new
{
Order = p.OrderId,
link = "/order/" + p.OrderId.ToString(),
StudentId = (p.PersonId.HasValue ? p.PersonId.Value : 0),
FirstName = p.IdentifierAccount.Person.FirstName,
LastName = p.IdentifierAccount.Person.LastName,
DeliverBy = p.DeliverBy,
OrderDate = p.OrderDate.HasValue ?
p.OrderDate.Value.Date.ToString("yyyy-mm-dd") :
""
}).ToDataTable();
Это выбор из списка объектов Order.
Список FilteredOrders взят из другого запроса linq-to-sql, и я вызываю его .AsEnumerable перед тем, как передать его этому конкретному запросу select new.
Выполнение этого в обычном коде работает нормально:
if (o.OrderDate.HasValue)
tempString += " " + o.OrderDate.Value.Date.ToString("yyyy-mm-dd");
Вот трассировка стека от ошибки. Это часть большой системы в школе для получения заказов на стенограммы из БД для отображения на экране.
Line 46:
Line 47: dt = FilteredOrders.Where(x => x != null).Select(p =>
Line 48: new
Line 49: {
Line 50: Order = p.OrderId,
Stack Trace:
[InvalidOperationException: Nullable object must have a value.] System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) +51 System.Nullable`1.get_Value() +1373881 Aqueduct.Platform.Web.packages.finance_carttranscriptorder_default.<PopulateSearchResultsGrid>b__1(CartTranscriptOrder p) in D:\Repositories\aqueduct\Aqueduct.Platform.Web\trunk\packages\finance\carttranscriptorder\default.aspx.cs:48 System.Linq.WhereSelectListIterator`2.MoveNext()
+107 System.Linq.Buffer`1..ctor(IEnumerable`1 source) +434 System.Linq.<GetEnumerator>d__0.MoveNext()
+108 Aqueduct.Core.Data.ObjectShredder`1.Shred(IEnumerable`1 source, DataTable table, Nullable`1 options) in D:\Repositories\aqueduct\Aqueduct.Core\trunk\Data\LinqExtensions.cs:116 Aqueduct.Core.Data.LinqExtensions.ToDataTable(IEnumerable`1 source) in D:\Repositories\aqueduct\Aqueduct.Core\trunk\Data\LinqExtensions.cs:49 Aqueduct.Platform.Web.packages.finance_carttranscriptorder_default.PopulateSearchResultsGrid(List`1 FilteredOrders) in D:\Repositories\aqueduct\Aqueduct.Platform.Web\trunk\packages\finance\carttranscriptorder\default.aspx.cs:47 Aqueduct.Platform.Web.packages.finance_carttranscriptorder_default.RunFilter() in D:\Repositories\aqueduct\Aqueduct.Platform.Web\trunk\packages\finance\carttranscriptorder\default.aspx.cs:101 Aqueduct.Platform.Web.packages.finance_carttranscriptorder_default.Page_Load(Object sender, EventArgs e) in D:\Repositories\aqueduct\Aqueduct.Platform.Web\trunk\packages\finance\carttranscriptorder\default.aspx.cs:22 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
+14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive()
+50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627