我有一个可变大小的字符串数组,我正在尝试以编程方式循环遍历数组并匹配表中的所有行,其中"Tags"列包含数组中的至少一个字符串.这是一些伪代码:
IQueryable<Songs> allSongMatches = musicDb.Songs; // all rows in the table
Run Code Online (Sandbox Code Playgroud)
我可以轻松地在一组固定的字符串上查询此表过滤,如下所示:
allSongMatches=allSongMatches.Where(SongsVar => SongsVar.Tags.Contains("foo1") || SongsVar.Tags.Contains("foo2") || SongsVar.Tags.Contains("foo3"));
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用(我得到以下错误:"带有语句体的lambda表达式无法转换为表达式树")
allSongMatches = allSongMatches.Where(SongsVar =>
{
bool retVal = false;
foreach(string str in strArray)
{
retVal = retVal || SongsVar.Tags.Contains(str);
}
return retVal;
});
Run Code Online (Sandbox Code Playgroud)
有人能告诉我完成这个的正确策略吗?我仍然是LINQ世界的新手:-)
有一段时间我会尝试使用LINQ.枚举集合并在我的代码中更改其某些属性的典型方法如下所示:
ATDataContext dc = new ATDataContext(Settings.connection_string);
int[] col = ListViewClass.getListViewSelectedPositionTags(listView);
try
{
foreach (var item in col)
{
var ctx = (from r in dc.MailingLists
where r.ID == item
select r).Single();
ctx.Excluded = 'Y';
ctx.ExcludedComments = reason;
}
dc.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
有一段时间有一个建议来做到这一点...似乎更聪明的方式:
var ctx = from r in dc.MailingLists
where col.Contains(r.ID)
select r;
foreach (var item in ctx)
{
item.Excluded = 'Y';
item.ExcludedComments = reason;
}
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
Iit在很多层面上都很有意义,我喜欢这个解决方案.它比第一个更聪明,更快捷.
我已经在生产环境中使用了这个解决方案一段时间了.
几周后,我在搜索应用程序日志文件时看到了什么,并看到了这一点:
"传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.此RCP请求中提供的参数太多.最大值为2100."
LINQ to SQL转换where col.Contains(r.ID)为IN子句看起来像:
WHERE ID …
我正在使用ASP.NET 3.5开发Web应用程序.该应用程序有数百个表.我在研讨会上被告知我应该为整个应用程序使用一个.DBML文件,而不是使用多个.DBML文件(stackoverflow中也有一个帖子说同样的事情).鉴于我有这么多表使用一个.DBML文件是有意义的还是我最好创建逻辑分组的多个.DBML文件?
例如,我正在考虑创建以下.DBML文件:
我对使用多个.DBML文件的一个担忧是如何处理.DBML文件的更新.例如,如果在输入新的销售订单时我必须更新客户表上的字段.我该怎么处理?我当然不希望在Customer和Sales Order .DBML文件中包含customer表.我可以在TransactionScope中包装操作吗?
我不知道以下是否对答案有任何影响,但我的计划是使用存储库模式和POCO类,以便.DBML文件中对表定义的引用对我的数据访问层是本地的.
谢谢
我目前正在学习C#和LINQ.我对他们有很多疑问.基本上,我需要一步一步的教程.
我想该dbml文件是数据库的配置文件.如果我双击dbml文件VS将在设计图中打开它.我可以在这里创建/删除/修改表格吗?我可以add new item用来添加LINQ to SQL Classes获取dbml文件吗?
下一步是什么?在数据库中生成表?生成SQL脚本?生成cs文件?什么时候?怎么样?
我想知道SQL Server中的价格字段对于类似商店的结构的最佳类型是什么?
看看这个概述,我们有数据类型称为money,smallmoney,然后我们有十进制/数字,最后浮动和真实.
名称,内存/磁盘使用情况和值范围:
将价格值存储在这些类型中真的很明智吗?那怎么样.INT?
让我们说一家商店使用美元,他们有美分,但我认为价格不是49.2142342所以使用大量小数显示美分似乎浪费了SQL带宽.其次,大多数商店不会显示200.000.000附近的任何价格(至少在正常的网上商店,除非有人试图在巴黎卖给我一座着名的塔)
那么为什么不去找一个int?
一个int很快,它只有4个字节,你可以很容易地产生小数,通过以美分而不是美元保存值然后在你呈现值时除以.
另一种方法是使用4个字节的smallmoney,但这需要CPU的数学部分来进行计算,其中Int是整数幂......在缺点上你需要划分每个结果.
使用smallmoney/money字段时,区域设置是否存在"货币"相关问题?这些在C#/ .NET中也会转移什么?
任何利弊?去整数价格或小钱币或其他?
你的经验告诉我什么?
c# sql-server database-design query-optimization linq-to-sql
我有一个Web应用程序,包括以下内容:
当我构建和部署时,Bin目录中没有设置文件或app.config,数据访问.dll,但更改web.config文件中的连接字符串不会相应地更改数据库 - 因此连接字符串必须被编译成数据访问dll.
我需要的是我的整个部署的一个配置文件 - 网站,数据访问dll,一切 - 有一个连接字符串被使用.目前,似乎有多个连接字符串在整个地方被使用或硬编码.
我如何才能最好地解决这个烂摊子?
谢谢你的帮助.
.NET 3.5,C#
我有一个带有"搜索"功能的网络应用程序.可搜索的一些字段是表中的第一类列,但其中一些实际上是XML数据类型中的嵌套字段.
以前,我构建了一个系统,用于为我的搜索动态构建SQL.我有一个很好的类层次结构,它构建了SQL表达式和条件语句.唯一的问题是SQL注入攻击不安全.
我正在阅读Rob Conery的优秀文章,该文章指出,如果永远不会枚举IQueryable结果,那么多个查询可以合并到服务器的单个TSQL查询中.这让我觉得我的动态搜索结构太复杂了 - 我只需要组合多个LINQ表达式.
例如(人为):
Author:
ID (int),
LastName (varchar(32)),
FirstName (varchar(32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
结果在以下查询中:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Run Code Online (Sandbox Code Playgroud)
我意识到这可能是一个简单的动态查询生成的完美解决方案,可以安全地从SQL注入 - 我只是循环我的IQueryable结果并执行其他条件表达式来获得我的最终单执行表达式.
但是,我找不到对XML数据评估的任何支持.在TSQL中,为了从XML节点获取值,我们会做类似的事情
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Run Code Online (Sandbox Code Playgroud)
但我找不到LINQ to SQL等同于创建此评估.有人存在吗?我知道我可以评估所有非XML条件的DB端,然后进行我的XML评估代码方面,但我的数据足够大,A)这是很多网络流量拖累性能和B)我会退出 - 如果我无法评估XML第一个DB端以排除某些结果集,则会出现内存异常.
想法?建议?
奖金问题 - 如果XML评估实际上是可能的DB方面,那么FLWOR支持呢?
在dbml文件中拖放存储过程时,我收到此错误:
未知返回类型
无法检测到以下存储过程的返回类型.在"属性"窗口中设置每个存储过程的返回类型.
我该如何解决这个错误?
我已经尝试过搜索这个但是找不到适合我情况的例子.
我有这种方法给回头客.如何使用字符串数组代码进行过滤?包含对我不起作用.
public static List<Customer> GetCustomers(string[] customerCodesArray)
{
using (busDataContext g = new busDataContext())
{
return g.Customers.Where(
x => x.customerCode.Contains(customerCodesArray)).ToList();
}
}
Run Code Online (Sandbox Code Playgroud) 首先,我不确定用什么术语来提出这个问题,这可能就是为什么我没有找到自己搜索的答案.
所以我正在使用Linq to SQL(C#,.Net 4),我希望得到一个符合条件的所有用户的列表,其基本内容我会做这样的事情:
var users = DataContext.Users.Where(x => x.Criteria1 == "something");
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我想要匹配一些字段,事情是这些特定的字段是一个常见的检查,我希望能够创建一个专用的功能,我可以在我的任何用户查询中使用它来检查这个比赛.
要尝试并解释说,好一点的可以举一个例子:比方说,用户有5面旗帜,我希望有一个共同的检查,看是否任何这些标志的设置.所以我可以这样写我的查询:
var users = DataContext.Users.Where(x => x.Flag1 || x.Flag2 || x.Flag3 || x.Flag4 || x.Flag5);
Run Code Online (Sandbox Code Playgroud)
但我想做的是分开"5旗检查",这样我也可以在其他查询中使用它,最终我想使用类似的东西:
var users = DataContext.Users.Where(x => x.Criteria1 == "something" && CheckForFlags(x));
Run Code Online (Sandbox Code Playgroud)
我通过这样的函数尝试了这个:
static bool CheckForFlags(User user)
{
return user.Flag1 || user.Flag2 || user.Flag3 || user.Flag4 || user.Flag5;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
"方法'布尔CheckForFlags(用户)'没有支持的SQL转换."
......这是有道理的,但是我能做些什么来让这项工作按我想要的方式进行?或者这是一个限制,因为我使用Linq to SQL,实际上是Linq to Objects可以使用的东西?