0

我在亚音速论坛上问了以下问题,但似乎只得到了一个回复,所以我想我也应该在这里发帖,看看是否有人可以进一步了解这个问题......

我希望使用选择工具(或查询工具)通过 SubSonic 创建以下 SQL 语句。它使用一个名为“SPLIT()”的自定义函数:

SELECT * FROM VwPropertyList
WHERE VwPropertyList.idCreatedBy = 123
AND VwPropertyList.idCounty = 45
AND 29 IN (SELECT Item FROM SPLIT(DistrictGroupList, ','))

(此 SQL 的最后一部分使用了 SPLIT 函数)

我的亚音速等效项如下所示...

将 mySelect 调暗为新 SubSonic.Select
mySelect.From(VwPropertyList.Schema)
mySelect.Where(VwPropertyList.Columns.IdCreatedBy).IsEqualTo(123)
mySelect.And(VwPropertyList.Columns.IdCounty).IsEqualTo(45)
mySelect.And(29 ).In(New SubSonic.Select("Item").From("SPLIT(" & VwPropertyList.Columns.DistrictGroupList & ", ',')"))

由于最后一部分,这不起作用..如何将“ AND 29 IN (SELECT Item FROM SPLIT(DistrictGroupList, ',')) ” 添加到我的 Subsonic.Select 中?

我从亚音速论坛得到的回复建议我取消 Subsonic.Select 并用硬编码的 InlineQuery() 语句替换.. 比如:

Dim SQL as String = "Select " & VwPropertyList.Columns.Item
SQL = SQL & " From " & VwPropertyList.Schema.TableName
SQL = SQL & " Where " & VwPropertyList.Columns.IdCreatedBy & " = @CreatedBy "
SQL = SQL & " And " & VwPropertyList.Columns.IdCounty & " = @County "
SQL = SQL & " And @DistrictGroup IN (Select Item From SPLIT(DistrictGroupList,',')"

Items = SubSonic.InlineQuery().ExecuteTypedList(Of MyItem)(SQL, 123,45,29)

如果可能的话,我更喜欢使用 SubSonic.Select,以便我可以利用分页功能等。

有任何想法吗?

4

4 回答 4

2

您可以按照 John 的建议进行操作,也可以使用我们的 InlineQuery 编写 SQL - 它允许您编写原始 SQL 并传入参数:

var qry=new InlineQuery("SELECT * FROM table WHERE column=@param",value)

于 2009-03-30T18:25:33.047 回答
1

您可以尝试像这样使用原始查询对象(2.1 之前)(未经测试,来自内存):

Query q = new Query(VwPropertyList.Schema.TableName);
q.WHERE("29 IN (SELECT Item FROM SPLIT(DistrictGroupList, ','))");

// pass q.ExecuteReader() to the Load() method of your view.
于 2009-03-30T15:56:23.093 回答
0

我建议您在寻找分页时使用原始 Query 对象。内联查询没有任何允许分页的方法。

如果您绝对想使用 Subsonic.Select 您可以将这两个想法结合起来并运行内联查询以获取值列表,然后使用常规 Subsonic.Select 并将检索到的值传递给选择案例,但是您将制作两个前往分贝。

在旁注中,我更喜欢阅读使用流畅界面编写的 Subsonic.Select 语句,即

SubSonic.Select.AllColumnsFrom() .Where(VwPropertyList.Columns.IdCreatedBy).IsEqualTo(123) .And(VwPropertyList.Columns.IdCounty).IsEqualTo(45) .ExecuteAsCollection();

于 2009-03-30T21:28:36.960 回答
0

感谢您的回复。

我最终做了 InlineQuery 并且只是重新编写了通常由 Subsonic.Select 生成的分页代码......不是最好的解决方案,但它似乎工作。

如果我能做这样的事情会很好:

Dim s As New SubSonic.Select
s.From(VwPropertyList.Schema)
sWhere(VwPropertyList.Columns.IdCreatedBy).IsEqualTo(123)
sAnd(VwPropertyList.Columns.IdCounty).IsEqualTo(45)
s.And(29).In( New InlineQuery("(SELECT Item FROM SPLIT(DistrictGroupList, ','))"))

于 2009-03-31T16:56:03.097 回答