![](/img/trans.png)
[英]In Linq-to-SQL, does IMultipleResults hit the database more than once?
[英]Linq-to-SQL WHERE IN statement returns more than is wanted
好吧,我正在嘗試制作局部視圖和控制器,其工作是選擇並顯示當前正在父視圖中查看的任何產品的附件列表。
我正在使用的數據庫將此信息存儲在一個格式為逗號分隔列表的字段中,如下所示:
productnr,productnr2,productnr3,productnr4
所以我使用以下代碼來檢索此列表並使用它來運行SQL WHERE IN語句的等效項:
[ChildActionOnly]
public ActionResult _ListAccessories(string Artnr)
{
var List = (
from ArtTbl in db.ArtTbl
where ArtTbl.ArticleNr == Artnr
select ArtTbl.AccessoryList)
.SingleOrDefault();
var AccList = customFunctions.Accessories(text);
var AccQuery =
from Art in db.ArtTbl
where AccList.Contains(ArtTbl.ArticleNr)
select new AccessoryList
{
Artnr = ArtTbl.ArticleNr,
Name = ArtTbl.Namefield_1,
};
return PartialView(AccQuery);
}
AccList變量中的函數將第一個字符串轉換為下面的結果。 我這樣做是因為我看到的所有示例都使用了這樣的語法,函數似乎正常工作,因為我已經通過將它作為viewBag發送到視圖進行測試,只是為了檢查它看起來是否正確:
"productnr", "productnr2", "productnr3", "productnr4"
這也是AccessoryList模型的樣子,只是一個非常簡單的模型:
public class AccessoryList
{
public string Artnr { get; set; }
public string Name { get; set; }
public AccessoryList()
{
}
}
現在這個代碼有效,但問題是它太慷慨了,如果我在列表中有一個產品編號說“AP500W”那么它也會返回“AP500”或只是“500”。 這是一個問題,因為它應該只返回完全匹配。
你遇到問題的原因始於和結束:
我正在工作的數據庫將此信息存儲在一個格式為逗號分隔列表的字段中
LINQ正在將其轉換為將整個字段值視為單個實體的SQL語句 - 因為它是單個實體。 在評估Contains()
,它只是查找匹配的子字符串值。 這就是AP500
和500
與AP500W
匹配的AP500W
。
因為你真的想要做相當於WHERE IN (...)
事情,所以你需要將你的MVA(多值屬性)轉換成一組不同的值。
該查詢適用於您發送單個字符串值的視圖包的示例:
"productnr", "productnr2", "productnr3", "productnr4"
您的數據庫值實際上是單個字符串值 :
"productnr, productnr2, productnr3, productnr4"
差異很微妙但非常重要。 請注意,在第二個示例中,只有一個數據字符串充當單個值。
丹尼斯,
我知道以下內容並不能完全解答您的問題。 但是,它可能會讓您更接近分辨率。 在你的例子中,你說:
where AccList.Contains(ArtTbl.ArticleNr)
這就是為什么你得到整個結果集的通配符結果。 緩解這種情況的一種方法是僅檢查結果字符串的前部:
where AccList.StartsWith(ArtTbl.ArticleNr)
你甚至可以看看(因為我確定這不會起作用):
where AccList.Any(x => x.StartsWith(ArtTbl.ArticleNr))
在上述情況下,你會得到'AP50', 'AP500'
等的結果。可能值得進一步調查(我現在不在編譯器,因此無法驗證上述是否按預期工作或不是:-))。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.