在LINQ to SQL类,为什么属性是从外键创建EntitySet对象,实施IEnumerable,作为地方上的对象DataContext是Table其实现目标IQueryable?
编辑:澄清一下,这是一个例子,说明了我想要了解的内容.这个例子:
ctx.Matches.Where(x => x.MatchID == 1).Single()
.MatchPlayers.Max(x => x.Score);
Run Code Online (Sandbox Code Playgroud)
在以下位置点击数据库两次:
ctx.MatchPlayers.Where(x => x.MatchID == 1)
.Max(x => x.Score);
Run Code Online (Sandbox Code Playgroud)
只运行1个查询.以下是痕迹:
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
Run Code Online (Sandbox Code Playgroud)
和
exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1 …Run Code Online (Sandbox Code Playgroud) 我有一个A具有简单导航属性的实体B.对于任何给定的实例A,我们期望几个相关的千个实例B.
没有我称之为的情况:
foreach(var x in A.B) { ... }
Run Code Online (Sandbox Code Playgroud)
相反,我只对进行聚合操作感兴趣
var statY = A.B.Where(o => o.Property == "Y");
var statZ = A.B.Where(o => o.CreateDate > DateTime.Now.AddDays(-1));
Run Code Online (Sandbox Code Playgroud)
据我所知,EF实例化了数千个对B的引用,并在内存中执行这些操作.这是因为导航属性使用EntityCollection.相反,我希望它尽可能在SQL级别执行这些查询.
我目前的预感是导航属性可能不是正确的方法.我不喜欢EF,所以我对其他方法持开放态度.但是如果可能的话,我很想知道在EF下正确的方法.
(我正在使用EF4.)
我一直在和这个摔跤,现在看起来似乎不太可能.
我想要Concat()两个IQueryable,然后将结果作为单个查询执行.我试过这样的事情:
var query = from x in ...
select new
{
A = ...
B = ...
C = ...
};
var query2 = from y in ...
select new
{
A = ...
B = ...
C = ...
};
var query3 = query.Concat(query2);
Run Code Online (Sandbox Code Playgroud)
但是,最后一行给出了以下错误:
'System.Linq.IQueryable'不包含'Concat'的定义,并且最好的扩展方法重载'System.Linq.ParallelEnumerable.Concat(System.Linq.ParallelQuery,System.Collections.Generic.IEnumerable)'有一些无效的参数
看起来它正在期待IEnumerable争论.有没有办法解决?
看起来我可以将两个查询解析为IEnumerables然后再解决Concat()它们.但是创建单个查询会更有效,而且看起来应该是可行的.
我有一个Linq提供程序成功地从我选择的数据源获取数据,但是我现在想要做的是我有我的过滤结果集,允许Linq to Objects处理Expression树的其余部分(对于像Joins这样的东西,投影等)
我的想法是我可以通过ExpressionVisitor将结果集IEnumerable替换为包含我的IQueryProvider的表达式常量,然后返回该新表达式.还从我的IQueryable返回IEnumerable的提供程序......但这似乎不起作用:-(
有任何想法吗?
编辑:这里有一些好的答案,但给出了表格......
var qry = from c in MyProv.Table<Customer>()
Join o in MyProv.Table<Order>() on c.OrderID equals o.ID
select new
{
CustID = c.ID,
OrderID = o.ID
}
Run Code Online (Sandbox Code Playgroud)
在我的提供程序中,我可以轻松地从客户和订单中获取2个结果集,如果数据来自SQL源,我将构建并传递SQL Join语法,但是这种情况下数据不是来自SQL源,所以我需要做的代码中加入...但我说我有2分结果集,和LINQ到对象可以做一个连接...(以及后来的投影)这将是真正的好,只是代替表达常数MyProv.Table<Customer>和MyProv.Table<Order>用List<Customer>和List<Order>让一个List<>提供者处理表达式......这可能吗?怎么样?
我正在使用我自己的IQueryable <>扩展方法来创建可链接查询,例如FindAll().FindInZip(12345).NameStartsWith("XYZ").OrderByHowIWantIt()等然后在延迟执行时创建基于我的单个查询扩展方法链.
但问题是,扩展链中的所有位置(FindXYZ,FindInZip等)将始终组合为AND,这意味着我无法做到这样的事情:
FindAll().FirstNameStartsWith("X").OrLastNameStartsWith("Z")因为我不知道如何在一个单独的Where方法中注入OR.
知道如何解决这个问题吗?
额外; 到目前为止,我理解如何将表达式链接为或者如果我将它们包装起来(例如CompileAsOr(FirstNameStartsWith("A").LastNameStartsWith("Z").OrderBy(..))
我想要做的虽然稍微复杂一点(并且PredicateBuilder在这里没有帮助......)因为我希望以后的IQueryable能够基本上访问先前建立的Where条件,而不必将它们包装起来以创建Or之间他们.
当每个扩展方法返回IQueryable <>时,我理解它应该知道某个地方的查询条件的当前状态,这使我相信应该有一些自动化的方法或在所有先前的Where条件中创建Or而不必包装你想要什么或者.
你怎么看?如果您的DAO返回IQueryable以在控制器中使用它吗?
有人可以指出为什么会发生这种情况:
我正在使用它NHibernate和Linq它的提供者.
此处列出了失败的代码:
var sequence = session.Query<T>();
var wtfSequence = sequence.Where(x => true);
var okaySequence = sequence.Where(x => x.Id > 0);
Run Code Online (Sandbox Code Playgroud)
调试显示sequence(IQueryable<T>之后)包含2个元素,这些元素已添加到数据库中.
我希望第一个Where语句产生该序列中的所有元素,但不幸的是它留下了0个元素.
Where相反,第二个陈述实际上产生了2个元素,因为它应该起作用.
以下是NHibernate -> Sqlite第一个和第二个Where语句的查询.
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where @p0='true';@p0 = 'True' [Type: String (0)]
NHibernate: select cast(count(*) as INTEGER) as col_0_0_ from "BinaryUnitProxy_IndicatorUnitDescriptor" binaryunit0_ where binaryunit0_.Id>@p0;@p0 = 0 [Type: Int32 (0)]
Run Code Online (Sandbox Code Playgroud)
现在,如果我用my测试相同的代码InMemoryRepository,它将每个实体存储在一个简单的列表中,那么这个 …
我正在使用Entity Framework CodeFirst,我使用ICollection作为父子关系
public class Person
{
public string UserName { get;set}
public ICollection<Blog> Blogs { get; set;}
}
public class Blog
{
public int id { get; set; }
public string Subject { get; set; }
public string Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止一切正常,但我担心的是,每当我想获得一个人的博客时,我就把它当成了
var thePerson = _context.Persons.Where(x => x.UserName = 'xxx').SingleOrDefault();
var theBlogs = thePerson.Blogs.OrderBy(id).Take(5);
Run Code Online (Sandbox Code Playgroud)
现在,我明白,当执行该行时,该人的所有博客都会加载到内存中,然后从内存中进行排序和选择.这对于拥有大量博客的人员的记录来说并不理想.我想将Blog Child设为IQueryable,以便在拉到Memory之前在SQL数据库中完成排序和选择.
我知道我可以在我的上下文中将Blogs声明为IQueryable,以便我可以直接查询为
var theBlogs = _context.Blogs.Where(.....)
Run Code Online (Sandbox Code Playgroud)
但由于设计选择,这对我来说是不可行的,因为序列化问题,我想尽可能避免任何循环引用.所以,我没有在我孩子的父母实体中做任何参考.
我发现,我可以在博客上调用AsQueryable()方法
var theBlogs = thePerson.Blogs.AsQueryable().OrderBy(id).Take(5);
Run Code Online (Sandbox Code Playgroud)
这看起来对我来说太神奇了,看起来好得令人难以置信.所以我的问题.这个AsQueryable是否真的使ICollection成为现实中的IQueryable并在SQL Server中进行所有查询过程(延迟加载)或者它只是一个将博客像以前一样加载到内存中的转换,但是将接口从ICollection更改为IQueryable?
c# iqueryable icollection ef-code-first entity-framework-4.1
我希望将listview的datacontext绑定到可观察的集合.现在我有:
// CurrentEmploye = some employee
Entities.DatabaseModel m = new Entities.DatabaseModel();
var q = from t in m.TimeSheet
join emp in m.Employees on t.idEmployee equals emp.id
where emp.id == CurrentEmploye.id
select new
{
firstName = emp.firstName,
lastName = emp.lastName,
position = emp.position,
clockInDate = t.clockInDate,
clockOutDate = t.clockOutDate,
};
listView1.DataContext = q;
Run Code Online (Sandbox Code Playgroud)
该代码正确填充列表视图.现在,每当我更新listview项时,我都想更新listview.
我希望变量q是ObservableCollection类型,而不必创建一个包含firstName,lastName,position等的自定义类...我该怎么做?
我收到运行时错误
此方法支持LINQ to Entities基础结构,不应在代码中直接使用.
描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.
异常详细信息:System.InvalidOperationException:此方法支持LINQ to Entities基础结构,不应在代码中直接使用.
我试图通过在所有搜索字段上添加所有匹配记录(OR而不是AND)来生成查询而不是对每个搜索条件进行过滤.
public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class
{
var results = Enumerable.Empty<T>().AsQueryable();
if (search != null)
{
if (search.PolicyNumber.HasValue && typeof (IPolicyNumber).IsAssignableFrom(queryable.ElementType))
{
results = results.Union(queryable.SearchByPolicyNumber(search));
}
if (search.UniqueId.HasValue && typeof (IUniqueId).IsAssignableFrom(queryable.ElementType))
{
results = results.Union(queryable.SearchByUniqueId(search));
}
if (!string.IsNullOrWhiteSpace(search.PostCode) && typeof(IPostCode).IsAssignableFrom(queryable.ElementType))
{
results = results.Union(queryable.SearchByPostCode(search));
}
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
当我介绍var results = Enumerable.Empty<T>().AsQueryable();我需要从空的东西开始时机制开始失败.
如何从空集开始,然后在顶部构建Linq-to-sql结果?
iqueryable ×10
c# ×8
linq ×5
linq-to-sql ×2
asp.net-mvc ×1
casting ×1
dao ×1
icollection ×1
ienumerable ×1
lambda ×1
nhibernate ×1