当我执行以下查询时,即使有11条匹配的记录,也没有按照写入的方式返回.但是,如果我删除第6行和第9行的括号,则按预期返回所有11条记录.
1 select obj_id, obj_title, UI_DISPLAYNAME
2 from PITS_OBJECT
3 LEFT OUTER JOIN ui_displayname_view ON obj_create_ui_id = UI_ID
4 where
5 /* w/ parens, no results, w/o parens, expected results */
6 (
7 Upper( UI_DISPLAYNAME ) LIKE Upper( '%smith%' )
8 OR Upper( OBJ_TITLE ) LIKE Upper( '%smith%' )
9 )
10 /* end w/ parents, no results.... */
11 AND OBJ_ID IN (select obj_id from PITS_OBJECT where
12 (UPPER( OBJ_TITLE ) LIKE UPPER( '%smith%' ))
13 AND obj_id …Run Code Online (Sandbox Code Playgroud) 这是一个Windows窗体.
Panel具有AutoScroll = True
我正在动态添加面板到主面板,最终超出主面板显示矩形.然后将标签,组合框和文本框添加到添加的面板.
如果我选择一个组合框或文本框,它会将主面板滚动条位置重置为0,并且组合框的下拉菜单将放置在屏幕X,Y上,如果滚动条没有重置,它应该在那里.
我正在考虑在选择控件时保存滚动位置.测试后,似乎滚动位置还没有重置,所以我可以在这里捕获它.然后在希望面板的某些事件上恢复滚动位置.我试图找出我将用于恢复滚动位置的确切事件.我也希望当我这样做时,下拉菜单将被放置在正确的x,y.
一个更好的解决方案是创建一个基于面板控件的自定义控件,并可能覆盖一个事件?这样我每次使用滚动面板时都不需要保存滚动位置,从而使我的项目变得杂乱无章.
在C#中,可以使用params关键字为方法指定任意数量的类型化参数:
public void DoStuff(params Foo[] foos) {...}
public void OtherStuff {
DoStuff(foo1);
DoStuff(foo2, foo3);
}
Run Code Online (Sandbox Code Playgroud)
如果您已有对象列表,则可以将其转换为数组以传递给此方法:
DoStuff(fooList.ToArray());
Run Code Online (Sandbox Code Playgroud)
但是,有没有任何优雅的混合方式?也就是说,传入多个对象和对象列表,并将结果展平为一个列表或数组?理想情况下,我希望能够像这样调用我的方法:
DoStuff(fooList, foo1, foo2, anotherFooList, ...);
Run Code Online (Sandbox Code Playgroud)
截至目前,我知道如何做到这一点的唯一方法是将所有内容预处理到一个列表中,我不知道有什么方法可以做到这一点.
编辑:要清楚,我没有与params关键字结合,它只是一个相关的机制,帮助我解释我想做的事情.我很满意任何看起来干净的解决方案,并将所有内容整合到一个列表中.
鉴于以下代码,Resharper将正确警告我可能的NullReferenceExceptionon,foo.Bar因为可枚举中可能有null元素:
IEnumerable<Foo> foos = GetFoos();
var bars = foos.Select(foo => foo.Bar);
Run Code Online (Sandbox Code Playgroud)
满足静态分析器的一种方法是显式排除空值:
IEnumerable<Foo> foos = GetFoos().Where(foo => foo != null);
Run Code Online (Sandbox Code Playgroud)
我发现自己打字.Where(x => x != null)很多,所以我用扩展方法将其包装起来,现在我可以执行以下操作:
IEnumerable<Foo> foos = GetFoos().NotNull();
Run Code Online (Sandbox Code Playgroud)
问题是Resharper不知道NotNull()剥离空值.有没有办法让Resharper教这个事实?一般来说,有没有办法告诉Resharper一个 - IEnumerable返回方法永远不会有空值(所以我可以直接注释GetFoos())?
我知道我可以使用它NotNullAttribute告诉Resharper可枚举本身不是null,但我找不到一个可以说明可枚举内容的东西.
编辑:扩展方法看起来完全符合您的期望:
[NotNull]
public static IEnumerable<T> NotNull<T>(this IEnumerable<T> enumerable)
{
return enumerable.Where(x => x != null);
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个系统,需要允许用户被分组.这些组可以由系统中的其他特权用户自由创建,编辑和删除.那部分很容易; 只需创建一个group_users将用户链接到组的表.(如果你是规范化的坚持者,那么你可以创建一个group只列出组的group_users表,然后有一个表将它们链接在一起 - 这也很好)
这是它变得棘手的地方.客户端希望组还包含任意深度和任意重叠的组(组可以在多个组中,组可以包含多个组).这很容易存储(使用group_groups表),但如果没有像Oracle的CONNECT BY这样的排序扩展,很难查询.
这个递归层次结构也需要追溯 - 意味着如果组A包含组B,组B被修改,那么组A也将被修改 - 所以我不能作弊并且只是扁平化结构.如果你不相信我,它不能简单地被夷为平地,请考虑这种情况.你有一个名为"酷人"的小组,其中包含用户1和2.有人创建了一个名为"真正很酷的人"的小组,其中包含用户3并包含"酷人"组.当我查询"真的很酷的人"时,我应该得出结论,用户1,2和3都在群组中.现在说有人决定用户2不再是一个很酷的人,并从"酷人"中删除用户2.在那个时间点之后,"真正很酷的人"只包含用户1和3.如果我最初将结构弄平,当我将他从"酷人"中删除时,我不知道将用户2从"真正的酷人"中删除".
因此,在这种情况下,一个微不足道的扁平化将不起作用.我考虑过的其他选择:
group_users_flattened,但也保持一张group_groups桌子.为group_users_flattenedINSERT/UPDATE/DELETE 创建一个触发器,该触发器将转到该group_groups表,查找包含该组的所有组,并动态地进行相应的更改group_users_flattened.
还有其他我未考虑过的想法吗?
在我的项目中,我有一个MyClass实现IMyClass.我需要IMyClass通过转换其他项目列表来返回列表.为简单起见,假设我可以MyClass通过将另一个项传递给它的构造函数来创建一个just,即new MyClass(item).
考虑以下两行,(据我所知)产生相同的结果:
var option1 = items.Select(item => new MyClass(item)).Cast<IMyClass>().ToList()
var option2 = items.Select(item => new MyClass(item) as IMyClass).ToList()
Run Code Online (Sandbox Code Playgroud)
在我看来,选项#1需要双重枚举,一次将所有项目转换为我的界面,一次生成列表.如果我是对的那么选项#2会更聪明.但是,我从未见过使用类似#2选项的任何代码,我倾向于认为我不够聪明,无法想出其他C#社区没有的东西.
另外,我认为选项#2更美观,但那只是我.
我的问题是:我的选择#2是一个更好的主意,就像我认为的那样?是否有任何我想念的陷阱或其他原因我为什么要坚持选项#1?或者我可能比较两个愚蠢的想法,当有一个更聪明的第三个我完全错过了?
如何在GraphQL中编写对关系数据库执行良好的查询解析器?
使用本教程中的示例模式,假设我有一个带users和的简单数据库stories.用户可以创作多个故事但故事只有一个用户作为他们的作者(为简单起见).
在查询用户时,可能还希望获得该用户创作的所有故事的列表.一个可能的定义是GraphQL查询来处理它(从上面链接的教程中窃取):
const Query = new GraphQLObjectType({
name: 'Query',
fields: () => ({
user: {
type: User,
args: {
id: {
type: new GraphQLNonNull(GraphQLID)
}
},
resolve(parent, {id}, {db}) {
return db.get(`
SELECT * FROM User WHERE id = $id
`, {$id: id});
}
},
})
});
const User = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: {
type: GraphQLID
},
name: {
type: GraphQLString
},
stories: {
type: new GraphQLList(Story), …Run Code Online (Sandbox Code Playgroud) 我厌倦了使用文本框过滤数据网格视图,文本框包含在标签页中,但它不起作用,这里是代码:
private void textBox1_TextChanged(object sender, EventArgs e)
{
try
{
((DataTable)dataGridView1.DataSource).DefaultView.RowFilter = "like '%" + textBox1.Text.Trim() + "%' ";
}
catch (Exception) { }
}
Run Code Online (Sandbox Code Playgroud) 我有一个特殊的标题,我想附加到我发布的所有消息.我可以通过在Publish调用中指定它来逐个添加此标头:
_bus.Publish(myMessage, context => context.SetHeader("my key", "my value"));
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是SetHeader为每次发布维护此调用都变成了一件苦差事.在总线配置期间或其他任何地方,有没有办法指定将附加到所有消息的标头?也就是说,有没有办法做以下事情?
ServiceBusFactory.New(sbc =>
{
sbc.UseRabbitMq();
sbc.ReceiveFrom(hdoQueue);
// This is what I'd like to be able to do:
sbc.BeforePublish(context => context.SetHeader("my key", "my value"));
});
Run Code Online (Sandbox Code Playgroud)
我相信有一个解决方案涉及实现,IOutboundMessageInterceptor但我找不到一种方法来附加我的拦截器.有ServiceBusConfigurator.AddInboundInterceptor方法但不是ServiceBusConfigurator.AddOutboundInterceptor方法.
我有一个来自Javascript客户端的DTO.当我尝试发送deleteFromService请求对象是空的(看起来它只是刚刚编辑).如果我将方法更改为postToService请求对象,则填充正确.
我使用的是3.9 API.我在这里不知所措.
服务:
public object Post(Order request)
{
return _orderRepository.InsertOrder(request);
}
public object Delete(Order request)
{
_orderRepository.DeleteOrder(request.Uuid);
return true;
}
Run Code Online (Sandbox Code Playgroud)
JS:
//Fails
serviceClient.deleteFromService("order", order, function () { }, deleteFailed);
//Works
serviceClient.postToService("order", order, function () { }, deleteFailed);
Run Code Online (Sandbox Code Playgroud)
更新:
我在ServiceStack源代码中发现了这个问题.它像处理GET一样处理DELETE并创建请求对象而不是正文,就像它对POST一样.
if (httpMethod == HttpMethods.Get || httpMethod == HttpMethods.Delete || httpMethod == HttpMethods.Options)
{
try
{
return KeyValueDataContractDeserializer.Instance.Parse(queryString, operationType);
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,ServiceStack JS客户端使用与POST相同的逻辑创建DELETE请求,通过填充您将其发送到正文的数据(技术上是jQuery XHR dataprop),这意味着服务器无法使用获取客户端发送的消息.
我看对了吗?JS客户端的删除是否被破坏?
c# ×6
sql ×2
winforms ×2
.net ×1
casting ×1
datagridview ×1
filter ×1
graphql ×1
linq ×1
masstransit ×1
mysql ×1
parentheses ×1
recursion ×1
resharper ×1
servicestack ×1