标签: iqueryable

LINQ2SQL中的EntitySet与Table查询性能

在LINQ to SQL类,为什么属性是从外键创建EntitySet对象,实施IEnumerable,作为地方上的对象DataContextTable其实现目标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)

linq ienumerable iqueryable linq-to-sql

9
推荐指数
1
解决办法
4477
查看次数

EF构建了EntityCollection,但我(我想)我想要IQueryable

我有一个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.)

entity-framework iqueryable

9
推荐指数
1
解决办法
1422
查看次数

Concat有两个匿名类型的IQueryables?

我一直在和这个摔跤,现在看起来似乎不太可能.

我想要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()它们.但是创建单个查询会更有效,而且看起来应该是可行的.

c# linq entity-framework iqueryable

9
推荐指数
1
解决办法
4628
查看次数

执行IQueryable查询的一部分并将其余部分推迟到Linq for Objects

我有一个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<>提供者处理表达式......这可能吗?怎么样?

c# linq iqueryable expression-trees

8
推荐指数
2
解决办法
4040
查看次数

将IQueryable <T> Where()扩展为OR而不是AND关系

我正在使用我自己的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而不必包装你想要什么或者.

c# iqueryable

8
推荐指数
2
解决办法
4962
查看次数

ASP MVC:服务应该返回IQueryable吗?

你怎么看?如果您的DAO返回IQueryable以在控制器中使用它吗?

c# asp.net-mvc dao iqueryable

8
推荐指数
2
解决办法
2990
查看次数

C#奇怪的lambda行为

有人可以指出为什么会发生这种情况:

我正在使用它NHibernateLinq它的提供者.

此处列出了失败的代码:

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,它将每个实体存储在一个简单的列表中,那么这个 …

c# linq nhibernate lambda iqueryable

8
推荐指数
1
解决办法
270
查看次数

ICollection上的AsQueryable()是否真的会延迟执行?

我正在使用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

8
推荐指数
1
解决办法
5203
查看次数

IQueryable <a> to ObservableCollection <a>其中a =匿名类型

我希望将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等的自定义类...我该怎么做?

c# casting iqueryable observablecollection

8
推荐指数
1
解决办法
5692
查看次数

Enumerable.Empty <T>()AsQueryable已(); 此方法支持LINQ to Entities基础结构,不应在代码中直接使用

我收到运行时错误

此方法支持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结果?

c# linq entity-framework iqueryable linq-to-sql

8
推荐指数
1
解决办法
4330
查看次数