实体框架.Select()和.Where()实体框架之间有什么区别?例如
return ContextSet().Select(x=> x.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
VS
ContextSet().Where(x=> x.FirstName == "John")
Run Code Online (Sandbox Code Playgroud)
我何时应该使用.Selectvs .Where?
我需要能够在Linq查询中具有可选参数,或者如果需要从查询中删除该可选参数,则能够将查询分配给类似IF的var.
如果我在IF语句中设置查询var,那么当我尝试循环时,它告诉我var在上下文中不存在.
if (whichGroup == "All")
{
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr
select o
);
}
else
{
var listOppLineData = (from o in db.opportunity_vws
where o.fiscal_yr_and_qtr == qtr && o.Group == whichGroup
select o
);
}
foreach (var data in listOppLineData) //listOppLineData doesn't exist here
{
Run Code Online (Sandbox Code Playgroud)
我需要在我认为的IF语句之前设置var,但我不知道将它设置为什么.
var listOppLineData = ""; // gives me
Cannot implicitly convert type 'System.Linq.IQueryable<Forecast.Models.opportunity_vw>' to 'string'
IQueryable listOppLineData = new IQueryable(); //gives me
Cannot create an instance of …Run Code Online (Sandbox Code Playgroud) 重述问题
我正在复活这个问题,因为我今天刚刚再次遇到这个错误,我仍然完全混淆为什么C#编译器无法检查命名空间和类型中的类型之间的冲突,因为命名空间不存在.
如果我有...
public Foo MyFoo { get; set; }
Run Code Online (Sandbox Code Playgroud)
...为什么编译器会关心Foo命名空间和类型?您可以将属性声明为命名空间而不是类型吗?
"名称空间使用类似"编译器错误背后的逻辑是什么?这有什么问题可以拯救我?
[我如何标记Eric Lippert?:)]
原始问题
问题
我有一个带有默认命名空间的项目"Foo" CompanyName.Foo.我有一个名为"Foo"的数据库.
当我在数据库上运行SqlMetal.exe时,它会生成一个类CompanyName.Foo.Models.Foo.
然后,当我尝试使用此类作为类型创建属性时,像这样......
using CompanyName.Foo.Models;
...
public Foo DataContext { get; set; }
Run Code Online (Sandbox Code Playgroud)
......我收到错误:
'CompanyName.Foo'是'命名空间',但用作'类型'.
我被迫做...
public CompanyName.Foo.Models.Foo Foo { get; set; } // :-(
Run Code Online (Sandbox Code Playgroud)
问题:
为什么会出现此错误?我的财产声明不包含CompanyName,为什么这是一个问题?简单地说:Foo != CompanyName.Foo.另外,为了确保,我搜索了我的整个解决方案,namespace Foo并提出了零命中(如果我实际使用了命名空间Foo,我可以理解得到错误).
[回答]Foo每次我想使用它时,有没有办法完全符合条件?
[回答]有没有办法让SqlMetal将类命名为Foo(不用更改我的数据库名称)?我可以使用开关更改命名空间,但我不知道如何更改实际的类名.
更新
仍在寻求(1)的答案.
OKW钉(2)和(3).
Usings
我的所有using陈述都提出了要求:
using System;
using System.ComponentModel;
using System.Data.Linq; …Run Code Online (Sandbox Code Playgroud) c# compiler-construction code-generation namespaces linq-to-sql
我一直在我的一个页面上收到一个错误,linq查询已超时,因为它花了太长时间.它使页面无法使用.
这是一个报告页面,每天只能由管理员访问一次.根本不可避免地削减这个查询,它只需要对大量数据进行排序.
解决这个问题的解决方法我已经阅读过,通过增加数据上下文中的超时属性,但我想避免这样做,因为它会为整个网站改变它.
有没有办法为单个页面设置更长的时间?
在Linq to SQL的DataContext上,我可以调用SubmitChanges()来提交所有更改.
我想要的是以某种方式拒绝datacontext中的所有更改并回滚所有更改(最好不要转到数据库).
这可能吗?
我觉得我在圈子里跑来跑去.我似乎无法决定使用LINQ to SQL正确的存储库模式.如果您熟悉Rob Conery的 MVC店面,您将看到他的实现将LINQ生成的模型与另一个类包装在一起,并将LINQ生成的模型简单地视为数据传输对象(DTO).它看起来像这样:
//Custom wrapper class.
namespace Data
{
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public IList<Address> Addresses {get;set;}
}
}
//Linq-Generated Class - severly abbreviated
namespace SqlRepository
{
public class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public EntitySet<Address> {get;set;}
}
}
//Customer Repository
namespace SqlRepository
{
public class UserRepository : IUserRepository
{
private _db = new DB(); //This is the Linq-To-Sql …Run Code Online (Sandbox Code Playgroud) 可能重复:
LINQ to SQL:返回匿名类型?
我有一个标准的LINQ to SQL查询,它以匿名类型返回数据(包含大约6列各种数据类型的数据).
我想将此返回的对象提供给程序的其他部分,方法是将其返回给方法调用程序,或者将其分配给包含该方法的对象的属性.
如果它是匿名类型("var"),我怎么能这样做呢?
编辑 - 这是代码:
using (ormDataContext context = new ormDataContext(connStr))
{
var electionInfo = from t1 in context.elections
join t2 in context.election_status
on t1.statusID equals t2.statusID
select new { t1, t2 };
}
Run Code Online (Sandbox Code Playgroud) 给出以下LINQ to SQL查询:
var test = from i in Imports
where i.IsActive
select i;
Run Code Online (Sandbox Code Playgroud)
解释的SQL语句是:
SELECT [t0].[id] AS [Id] .... FROM [Imports] AS [t0] WHERE [t0].[isActive] = 1
Run Code Online (Sandbox Code Playgroud)
假设我想在select中执行一些无法转换为SQL的操作.我的理解是,实现这一目标的传统方法是AsEnumerable()将其转换为可行的对象.
鉴于此更新的代码:
var test = from i in Imports.AsEnumerable()
where i.IsActive
select new
{
// Make some method call
};
Run Code Online (Sandbox Code Playgroud)
并更新了SQL:
SELECT [t0].[id] AS [Id] ... FROM [Imports] AS [t0]
Run Code Online (Sandbox Code Playgroud)
注意执行的SQL语句中缺少where子句.
这是否意味着整个"Imports"表被缓存到内存中?如果表中包含大量记录,这会导致性能下降吗?
帮助我了解幕后实际发生的事情.
如果我在关键字段上查询具有条件的表,如下所示:
var user = from u in dc.Users
where u.UserName == usn
select u;
Run Code Online (Sandbox Code Playgroud)
我知道我会得到零结果或一个结果.我是否仍然可以继续使用for-each检索结果,或者是否有其他首选方法来处理这种情况.
linq-to-sql ×10
linq ×7
c# ×6
.net ×2
asp.net-mvc ×2
asenumerable ×1
asp.net ×1
iqueryable ×1
namespaces ×1
timeout ×1