如何于linq to entities教程中使用SQL Server的用户自定义函数

在 LINQ to Entities 查询中无法构造实体或复杂类型_百度知道
在 LINQ to Entities 查询中无法构造实体或复杂类型
com/zhidao/wh%3D600%2C800/sign=05e3c3a6a5efce1bea7ec0cc9f61dfe6/0d338744ebf81a4ccaa9./zhidao/pic/item//zhidao/wh%3D450%2C600/sign=68f61a31f1deb48ffb3ca9dac52f161f/0d338744ebf81a4ccaa9?.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http://f..jpg" esrc="http调试到这句提示 &nbsp://f,求详解://f.baidu.SYSUSER”;此错误 &nbsp:在 LINQ to Entities 查询中无法构造实体或复杂类型“CallCenter_DB_DemoModel?.hiphotos
提问者采纳
=&&&&&&就可以new&db.ToList()&&正确代码;&&&&&&{&&OrderDetails&nbsp,&nbsp:var&&&userid);&nbsp.OrderId;&&&Total&&&&&&&&&&&&&&&&&&&);OrderDate&);&&nbsp.OrderD&&&&&&&&&&&&选择数据时候&&&&nbsp://&&&&&nbsp.Total.html" target="_blank">c;列表&&&&&&&&nbsp,&&&nbsp:var&&&&&&&&&&&&blogs.O&&nbsp,&&c;&nbsp.ToList();&&&&&nbsp.UserId&&=&&==&&&c;&&&&&&&&&&&&&&&nbsp.Where(od&c;=&&=&&&&&&&&&&new&=&&OrderDetails&nbsp,&==&&c;&但是如果从一个&&&&&&&=&&&nbsp.UserId==userid).OrderId);&==&&&linq&&nbsp.Where(o&&nbsp.Where(o=&&&nbsp错误代码;&&nbsp.ToList();&&&&nbsp,&&&&&&&&&&&&&nbsp.Where(od&&&&=&&=&orders&&=&&nbsp.OrderId);OrderId&&&&&nbsp.OrderD&nbsp.OrderD&&=&&&&&o;&&nbsp.ToList()&&&&=&&&&&已知的类;&&&orders&Order&&c;&&&&&&=&&&&&&&&&=&&&&o;&OrderDate&&&&&nbsp.OrderId&&&&&&&=&&&&&List&&&&&&&&&nbsp://&&&&&&&&}&&&&&&&&&&&nbsp:&&&&&nbsp,只能匿名的;&&&&nbsp.Select&c;&&&&&nbsp.Select(c&&&&&&&&nbsp.OrderId&&nbsp.O&nbsp.OrderD&/StudyLife/p/3202616;&&new&&&nbsp。<a href="&&&&&(c&&&}&/StudyLife/p/3202616;&原理;&&nbsp,&&&&&nbsp.ToList();&{&已知的对象;&&不能new&&Order&nbsp。&&c;&nbsp.OrderId;&&&&&&=&OrderId&&&nbsp.T&&nbsp
提问者评价
来自团队:
其他类似问题
为您推荐:
linq的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1、首先在数据库中创建好存储过程。 2、在实体模型中添加存储过程的映射。此时根据映射过来的查询结果有两种途径:第一种可以选择添加选择的存储过程的函数到实体模型中。这样的话,查询的结果将会是xxx_result类型。
List&GetTestsString_Result& results = db.GetTestsString("2").ToList();
foreach (var result in results )
Console.WriteLine(result .Id);
其中,GetTestsString_Result为EF自己生成的映射model,GetTestsString为存储过程名。
第二种不选择添加的话。可以在实体模型中选择新增--函数导入,选择已有实体映射和自命名方法添加过来存储过程。
List&CallProduct& results = db.GetNewTestsString("2").ToList();
foreach (var result in results)
Console.WriteLine(result.Id);
其中,CallProduct为系统中已有的model,GetNewTestsString为自定义的函数名。
阅读(...) 评论()linq to entities查询使用大于小于匹配数据库字符串日期方法_百度知道
linq to entities查询使用大于小于匹配数据库字符串日期方法
Entity Framework(LINQ to Entities)使用日期判断条件Truncate日期函数,类似Convert函数,MYSQL数据库可以直接使用convert(varchar(10),a.cjrq,120)LINQ to Entities使用日期字段查询,截取日期,不包括时间,测试环境SQL Server,Entity Framework4.0&&&&&&&&public&void&TestMethod1()&&&&&&&&{&&&&&&&&&&&&using&(var&_context&=&new&hotelEntities())&&&&&&&&&&&&{&&&&&&&&&&&&&&&&var&rq&=&DateTime.Now.D&&&&&&&&&&&&&&&&var&query&=&from&q&in&_context.UV_RZJL_RZRY_Single&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&EntityFunctions.TruncateTime(q.LDRQ)&&=rq&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&q;&&&&&&&&&&&&&&&&Assert.Inconclusive(query.Count().ToString());&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}& & &//SqlFunctions.DateDiff的函数也可以实现&&&&&&&&public&void&TestMethod1()&&&&&&&&{&&&&&&&&&&&&using&(var&_context&=&new&hotelEntities())&&&&&&&&&&&&{&&&&&&&&&&&&&&&&var&rq&=&DateTime.Now.D&&&&&&&&&&&&&&&&var&query&=&from&q&in&_context.UV_RZJL_RZRY_Single&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&SqlFunctions.DateDiff(&day&,rq,q.LDRQ)&0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&q;&&&&&&&&&&&&&&&&Assert.Inconclusive(query.Count().ToString());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}筛选本周数据& & & & & &//获取当天的数据 & & & & & &DrawRecordDA _recordDA = new DrawRecordDA(); & & & & & &var query = _recordDA.GetQuery(); & & & & & &//筛选 当天 & & & & & &//query = query.Where(q=&SqlFunctions.DateDiff(&day&,q.AddTime,DateTime.Now)==0); & & & & & &//筛选 当天 & & & & & &// &query = query.Where(q=&q.AddTime.Day==DateTime.Now.Day); & & & & & &//筛选 本周 & & & & & &query = query.Where(q =& SqlFunctions.DateDiff(&week&, q.AddTime, DateTime.Now) == 0); & & & & & &Console.WriteLine(query.Count());
其他类似问题
为您推荐:
提问者采纳
private EntitiesContext db = 供钉垛固艹改讹爽番鲸new EntitiesContext();var list=(from j in db.实体where (int)j.date as &&&(int)j.date&).ToList();date的长度如果大于10要强转成long
Convert.ToInt32(q.date)我准备用这个,执行的提示LINQ to Entities 无法辨识方法 &#39;Int32 ToInt32(System.String)&#39; 方法,而且这个方法无法转译成存放区运算式。
嗯,忘了跟linq数据不能C#方法处理。那就用Contains()
这不是模糊查询吗?
string不能转换成int的话就只能用匹配的方法了,linq要转换成IL的,所以不能用C#的方法处理数据库的数据。
也只能这样处理了,因为我数据存储的数据非常庞大,从前年就开始有数据了,所以我只能是模糊匹配大概月份,查询出List数据集了,再针对这个List去做筛选需要的!虽然的可以实现,但是也大大降低了效率!
这样,先用date=和date=的项的id,然后在用id查询这两个id之前的数据
最坑爹的就是,这张表没有ID!算了,朋友谢谢你了。我对这个linq查询也是刚接触,感觉用得很吃力!但是还是谢啦。
提问者评价
linq的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁2609人阅读
C#(117)
4.7 使用函数
扩展LINQ to Entities查询的简便方法就是使用函数。有四种类型的函数可以应用:
规范函数—LINQ to Entities本身没有提供的一组预定义的函数。
数据库函数—一组预定义的SQL Server函数。
模型中定义的函数—存储在EDM中的用户定义的实体SQL函数。
自定义数据库函数—可以在查询中使用的用户定义的数据库函数。
在这部分,只涉及到规范函数和数据库函数,另外两个函数&#20540;得作出更多的解释和需要EF更深的知识,我们在11章再讨论。
4.7.1 规范函数
规范函数是执行数据库操作的有效方法。例如,有执行数学运算,日期比较的函数等等。在EF1.0,规范函数只能在Entity SQL查询中执行,但是现在已经使用CLR方法进行了封装,如此一来就可以被LINQ to Entities调用。这一变化通过重用现有的功能扩展了LINQ to Entities的功能。
我们来看一个例子。我们的客户想要一个超过5天发货的订单列表。使用LINQ查询相当简单:
var result = from o in ctx.Orders
where o.OrderDate.AddDays(5) & o.ActualShippingDate
查询编译通过,但是在运行时会得到一个异常,因为翻译引擎不能将AddDays方法转换成合适SQL。
规范函数使用DiffDays方法填补这个漏洞,该方法接受两个日期作为参数,返回它们之间的天数。这个方法以及其他规范函数的的部分可以在System.Data.Objects命名空间下的EntityFunctions类中找到。
var result = from o in ctx.Orders
where EntityFunctions.DiffDays(o.OrderDate, o.ActualShippingDate) & 5
另一个例子使用数学函数。四舍五入、上取整、下取整、数的n次方,所有的操作都可以使用System.Math类中的方法执行。但是,正如DateTime方法,SQL翻译引擎不支持Math中的方法。你可以使用EntityFunctions类中的Pow,Round,Ceiling和Floor作为替代方法。
这些函数可以在查询中任何位置调用而不仅仅限于where子句。例如,你可以在select子句中使用Abs函数取得一个数的绝对&#20540;。
规范函数是实体SQL与数据库无关的函数。但是在很多情况下,将你的代码指定到特定的数据库也不是问题,因为你知道你不会改变使用的数据库。如果是这种情况,你可以调用特定数据库的函数更好的使用这个平台。
4.7.2 数据库函数
每个数据库都有自己的函数集。有一些函数在不同的RDBMS中是相通的,像ABS,LTrim,RTrim,它们都可以通过LINQ to Entities或者实体函数调用。其他函数在每个数据库中都是特有的或者说有不同的特征。
幸运的是你同样也可以调用这些函数。EF在System.Data.Objects.SqlClient命名空间下的SqlFunctions类下有很多指定到SQL Server的函数。Checksum,CharIndex,Cos,GetDate和Rand都是这些有用函数的例子。
除了规范函数和数据库函数属于不同的类,它们两个没有其他的区别。它们都是作为静态方法被调用以及可以在查询的任何位置被调用。下面的代码使用数据库函数展现超过5天发货的订单。
var result = from o in ctx.Orders
where SqlFunctions.DateDiff(&d&, o.OrderDate, o.ActualShippingDate) & 5
通过使用数据库函数,你配合你的代码到一个特定的数据库(本例子中是SQL Server)。这并不总是一个好主意,因为如果你更改数据库,就必须改变你的代码。但是如果你知道你不会改变你的应用程序使用的数据库,你可以使用数据库函数,没有任何问题。请务必慎重考虑是否应该使用这些函数。
使用特定于数据库的函数是配合你的数据库到一个数据库平台的两种方法之一。另一种选择是在代码中嵌入SQL查询。即使SQL是一种标准的语言,但查询往往依赖于特定数据库的特征,所以你最终都要将你的代码指定到特定的数据库。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:444817次
积分:6132
积分:6132
排名:第2440名
原创:126篇
转载:239篇
评论:82条
(2)(1)(1)(12)(12)(12)(6)(1)(3)(2)(3)(3)(13)(2)(1)(10)(4)(6)(12)(6)(3)(19)(7)(2)(8)(12)(13)(16)(6)(5)(6)(7)(1)(6)(3)(3)(13)(15)(6)(4)(18)(23)(13)(16)(22)(18)(13)LINQ to Entities尝试将NULL转为System.Int32出错一例-ling-数据库-壹聚教程网LINQ to Entities尝试将NULL转为System.Int32出错一例
下文大家和小编一起来看看在LINQ to Entities尝试将NULL转为System.Int32出错问题上的解决办法,如果你碰到可以一起来学习学习。
今天使用LINQ to Entities时出现了一个错误,为方便说明创建了个Demo表用于还原问题:
create table Person
&&& Id int identity(1,1) primary key,
&&& Name nvarchar(20) not null,
&&& Age int not null
insert into Person
'person1',20
insert into Person select 'person2',30
insert into Person select 'person3',40
LINQ to Entities相关程序:
var context = new testContext();
var data = context.People
&&& .GroupBy(item =& item.Name)
&&& .Select(item =& new { item.FirstOrDefault().Name, Age = item.Where(item2 =& item2.Age &= 30).Sum(item2 =& item2.Age) });
(var item in data)
&&& Console.WriteLine(&{0},{1}&, item.Name, item.Age);
程序执行出错,错误信息如下:
The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.
在SQL Server Profiler获取了对应SQL语句:
&&& 1 AS [C1],
&&& [Project4].[C1] AS [C2],
&&& [Project4].[C2] AS [C3]
&&& FROM ( Select
&&&&&&& [Project3].[C1] AS [C1],
&&&&&&& (Select
&&&&&&&&&&& SUM([Extent3].[Age]) AS [A1]
&&&&&&&&&&& FROM [dbo].[Person] AS [Extent3]
&&&&&&&&&&& Where ([Project3].[Name] = [Extent3].[Name]) AND ([Extent3].[Age] &= 30)) AS [C2]
&&&&&&& FROM ( Select
&&&&&&&&&&& [Distinct1].[Name] AS [Name],
&&&&&&&&&&& (Select TOP (1)
&&&&&&&&&&&&&&& [Extent2].[Name] AS [Name]
&&&&&&&&&&&&&&& FROM [dbo].[Person] AS [Extent2]
&&&&&&&&&&&&&&& Where [Distinct1].[Name] = [Extent2].[Name]) AS [C1]
&&&&&&&&&&& FROM ( Select DISTINCT
&&&&&&&&&&&&&&& [Extent1].[Name] AS [Name]
&&&&&&&&&&&&&&& FROM [dbo].[Person] AS [Extent1]
&&&&&&&&&&& )& AS [Distinct1]
&&&&&&& )& AS [Project3]
&&& )& AS [Project4]
查询得到的记录集:
1&&& person1&&& NULL
1&&& person2&&& 30
1&&& person3&&& 40
所以,问题的原因是Where(item2 =& item2.Age &= 30)导致了查询结果存在NULL值,在尝试将它转换成System.Int32时出了错,解决方法如下:
var data = context.People
&&& .GroupBy(item =& item.Name)
&&& .Select(item =& new { item.FirstOrDefault().Name, Age = item.Where(item2 =& item2.Age &= 30).Sum(item2 =& (int?)item2.Age) ?? 0 });
上一页: &&&&&下一页:相关内容
暂无与此文章相关内容最新内容

我要回帖

更多关于 linq 自定义 的文章

 

随机推荐