Ulh*_*ano 6 asp.net-mvc linq-to-entities
我正在使用EF.这是我的LINQ查询
public List<Tuple<int, string>> GetList()
{
return (from c in DALContext.MST
select new Tuple<int, string>(c.CD, c.NAME)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
当我调用GetList()时,它会抛出异常:LINQ to Entities中仅支持无参数构造函数和初始值设定项
相反,当我重写此查询时:
List<Tuple<int, string>> lst = new List<Tuple<int, string>>();
var query= (from c in DALContext.MST
select new{c.CD, c.NAME});
foreach (var item in query)
{
lst.Add(new Tuple<int,string>(item.CD,item.NAME));
}
return lst;
Run Code Online (Sandbox Code Playgroud)
它运作正常.我的第一个查询怎么了?
Joe*_*ler 11
其他答案对于正在发生的事情是正确的,但我没有看到任何人提到使代码工作的最佳方法: AsEnumerable()
public List<Tuple<int, string>> GetList()
{
return (from c in DALContext.MST.AsEnumerable()
select Tuple.Create(c.CD, c.NAME)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
该AsEnumerable方法充当应该转换为SQL并在数据库服务器中执行的代码之间的边界,以及在我们从数据库获得响应之后应该在内存中执行的代码.在表名称之后将其放在正确的位置告诉EF从MST表中获取所有记录,然后运行以下代码,从返回的值创建元组.
我改变了你new Tuple<int, string>进入Tuple.Create主要是因为我不喜欢任何比我更需要键入泛型类型参数.
LINQ to EF处理查询的方式与LINQ to SQL略有不同.在LINQ to EF中,你不能在LINQ表达式中放置带参数的构造函数,就像你在第一段代码中所做的那样:
from c in DALContext.MST
select new Tuple<int, string>(c.CD, c.NAME)
Run Code Online (Sandbox Code Playgroud)
Tuple的构造函数有两个参数,LINQ to EF不允许这样做.
原因在这里解释:
在某种程度上,这是一个问题,希望LINQ to Entities更清楚地了解查询的哪些部分在服务器上执行以及在客户端上执行哪个部分之间的边界.
例如,使用LINQ to SQL,可以编写LINQ查询,该查询不仅涉及服务器上的数据和服务器上的函数,还包括只能在客户端上执行并将它们混合在一起的函数.然后,LINQ to SQL提供程序将尽力解决问题,并在服务器和客户端的其他部分上执行它可以执行的部分.这很好,因为很容易只写你想要的任何查询,如果可能的话它会起作用.另一方面,如果你不小心写了一个查询,其中唯一可以在服务器上执行的部分是最基本的东西,它返回一个或多个表中的所有数据,然后在客户端上进行所有过滤,那就不太好了. (具有非常令人讨厌的性能后果).
使用LINQ to Entities,边界更明确.当您针对LINQ to Entities IQueryable实现编写LINQ查询时,整个查询在服务器上执行,如果查询的某些部分无法在服务器上执行,则必须使用ToQueryable()等创建显式边界. ToList().执行该查询并检索数据后,如果您愿意,可以使用LINQ to Objects进一步优化查询.通过这种方式,您可以明确了解边界的位置,并且可以更轻松地跟踪性能问题等.其中一个相关限制是LINQ to Entities中的select语句可以创建匿名类型或其他类型,只要它们具有默认构造函数和可设置参数即可.这最小化了select语句具有重大副作用的可能性.
| 归档时间: |
|
| 查看次数: |
1592 次 |
| 最近记录: |