标签: linq-to-sql

如何在LINQ中动态添加OR运算符到WHERE子句

我有一个可变大小的字符串数组,我正在尝试以编程方式循环遍历数组并匹配表中的所有行,其中"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 dynamic linq-to-sql

29
推荐指数
1
解决办法
2万
查看次数

sql查询中的最大参数数

有一段时间我会尝试使用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 …

c# linq-to-sql

29
推荐指数
1
解决办法
3万
查看次数

Linq to Sql - 多个.DBML文件或一个.DBML文件

我正在使用ASP.NET 3.5开发Web应用程序.该应用程序有数百个表.我在研讨会上被告知我应该为整个应用程序使用一个.DBML文件,而不是使用多个.DBML文件(stackoverflow中也有一个帖子说同样的事情).鉴于我有这么多表使用一个.DBML文件是有意义的还是我最好创建逻辑分组的多个.DBML文件?

例如,我正在考虑创建以下.DBML文件:

  • 顾客
  • 供应商
  • 雇员
  • 销售订单

我对使用多个.DBML文件的一个担忧是如何处理.DBML文件的更新.例如,如果在输入新的销售订单时我必须更新客户表上的字段.我该怎么处理?我当然不希望在Customer和Sales Order .DBML文件中包含customer表.我可以在TransactionScope中包装操作吗?

我不知道以下是否对答案有任何影响,但我的计划是使用存储库模式和POCO类,以便.DBML文件中对表定义的引用对我的数据访问层是本地的.

谢谢

database .net-3.5 linq-to-sql

29
推荐指数
2
解决办法
6920
查看次数

C#dbml文件来自哪里?

我目前正在学习C#和LINQ.我对他们有很多疑问.基本上,我需要一步一步的教程.

  1. 我想该dbml文件是数据库的配置文件.如果我双击dbml文件VS将在设计图中打开它.我可以在这里创建/删除/修改表格吗?我可以add new item用来添加LINQ to SQL Classes获取dbml文件吗?

  2. 下一步是什么?在数据库中生成表?生成SQL脚本?生成cs文件?什么时候?怎么样?

c# linq linq-to-sql

29
推荐指数
1
解决办法
6万
查看次数

哪种SQL Server字段类型最适合存储价格值?

我想知道SQL Server中的价格字段对于类似商店的结构的最佳类型是什么?

看看这个概述,我们有数据类型称为money,smallmoney,然后我们有十进制/数字,最后浮动真实.

名称,内存/磁盘使用情况和值范围:

  • 资金: 8字节(值:-922,337,203,685,477.5808至+922,337,203,685,477.5807)
  • Smallmoney: 4个字节(值:-214,748.3648到+214,748.3647)
  • 十进制: 9 [默认,分钟.5]字节(值:-10 ^ 38 +1到10 ^ 38 -1)
  • 浮点数: 8个字节(值:-1.79E + 308到1.79E + 308)
  • 实际: 4个字节(值:-3.40E + 38到3.40E + 38)

将价格值存储在这些类型中真的很明智吗?那怎么样.INT?

  • Int: 4个字节(值:-2,147,483,648到2,147,483,647)

让我们说一家商店使用美元,他们有美分,但我认为价格不是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

29
推荐指数
3
解决办法
3万
查看次数

.NET/LINQ-SQL/ASP.NET中的连接字符串地狱

我有一个Web应用程序,包括以下内容:

  • 一个Web项目(包含连接字符串的web.config文件 - 但Web项目中没有数据访问代码)
  • 一个数据访问项目,它使用LINQ-SQL类为Web项目UI提供实体(该项目有一个设置文件和一个app.config - 两者都有连接字符串)

当我构建和部署时,Bin目录中没有设置文件或app.config,数据访问.dll,但更改web.config文件中的连接字符串不会相应地更改数据库 - 因此连接字符串必须被编译成数据访问dll.

我需要的是我的整个部署的一个配置文件 - 网站,数据访问dll,一切 - 有一个连接字符串被使用.目前,似乎有多个连接字符串在整个地方被使用或硬编码.

我如何才能最好地解决这个烂摊子?

谢谢你的帮助.

.net asp.net configuration connection-string linq-to-sql

28
推荐指数
3
解决办法
2万
查看次数

LINQ to SQL可以查询XML字段DB-serverside吗?

.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支持呢?

xml sql .net-3.5 linq-to-sql

28
推荐指数
1
解决办法
1万
查看次数

无法检测到以下存储过程的返回类型

在dbml文件中拖放存储过程时,我收到此错误:

未知返回类型
无法检测到以下存储过程的返回类型.在"属性"窗口中设置每个存储过程的返回类型.

我该如何解决这个错误?

linq-to-sql

28
推荐指数
9
解决办法
3万
查看次数

Linq IN运营商

我已经尝试过搜索这个但是找不到适合我情况的例子.

我有这种方法给回头客.如何使用字符串数组代码进行过滤?包含对我不起作用.

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)

c# linq-to-sql

28
推荐指数
4
解决办法
4万
查看次数

创建一个公共谓词函数

首先,我不确定用什么术语来提出这个问题,这可能就是为什么我没有找到自己搜索的答案.

所以我正在使用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可以使用的东西?

c# linq-to-sql

28
推荐指数
1
解决办法
2万
查看次数