Dot-Net
“不能在 DateTime 上呼叫方法”和其他限制
有誰知道在編譯時沒有被擷取的 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 中 - 因此您可以編寫一個接受 a
datetime並返回 a的 UDF,datetime並通過 dbml 將其公開到數據上下文中。然後,您可以在查詢中使用它:where ctx.Date(foo.SomeDate) == DateTime.Today然而,這種方法不一定能很好地利用索引。
更新:
有關完整的血腥細節,您可以查看
System.Data.Linq.SqlClient.PostBindDotNetConverter+Visitor反射器 - 特別是Translate...方法;有些string功能是分開處理的。所以不是一個巨大的選擇 - 但這是一個實現細節。