Dot-Net

“不能在 DateTime 上呼叫方法”和其他限制

  • May 4, 2017

有誰知道在編譯時沒有被擷取的 LINQ to SQL 查詢限制的最終列表,以及(在可能的情況下)限制的解決方法?

到目前為止,我們的清單是:

  • 呼叫.Dateon 等方法DateTime
    • 未找到解決方法
  • string.IsNullOrEmpty
    • 簡單,只需== ""使用
  • .Last()
    • 我們用了.OrderByDescending(x => x.WhateverProperty).First()

基本上,這個列表是巨大的……它是處理的相對較小的一組事情之外所有內容。不幸的是,洩漏抽象定律開始生效,每個提供者都有不同的答案……

LINQ-to-Objects 可以做任何事情(幾乎),因為它是委託;LINQ-to-SQL 和實體框架具有不同的支持集。

一般來說,我在使用DateTime屬性等方面取得了相當大的成功——但實際上,你必須確保你的查詢表達式被單元測試覆蓋,這樣如果你改變提供者(或提供者得到更新)你知道這一切仍然有效。

我想一種觀點是從 TSQL 的角度來思考;沒有BOTTOM n,但有一個TOP 1(重新OrderByDescending);就 而言string.IsNullOrEmpty,您可能非常直截了當foo.Bar == null || foo.Bar == "":和你一起,DateTime.Date你可能可以用DATEPART/各種組件做很多事情。

LINQ-to-SQL 的另一個選項是將邏輯封裝在 UDF 中 - 因此您可以編寫一個接受 adatetime並返回 a的 UDF,datetime並通過 dbml 將其公開到數據上下文中。然後,您可以在查詢中使用它:

where ctx.Date(foo.SomeDate) == DateTime.Today

然而,這種方法不一定能很好地利用索引。


更新:

  • 支持的方法翻譯等在這裡
  • 支持的查詢操作等在這裡

有關完整的血腥細節,您可以查看System.Data.Linq.SqlClient.PostBindDotNetConverter+Visitor反射器 - 特別是Translate...方法;有些string功能是分開處理的。所以不是一個巨大的選擇 - 但這是一個實現細節。

引用自:https://stackoverflow.com/questions/323704