相关疑难解决方法(0)

IEnumerable vs List - 使用什么?他们是如何工作的?

我对枚举器如何工作以及LINQ有些怀疑.考虑这两个简单的选择:

List<Animal> sel = (from animal in Animals 
                    join race in Species
                    on animal.SpeciesKey equals race.SpeciesKey
                    select animal).Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

要么

IEnumerable<Animal> sel = (from animal in Animals 
                           join race in Species
                           on animal.SpeciesKey equals race.SpeciesKey
                           select animal).Distinct();
Run Code Online (Sandbox Code Playgroud)

我更改了原始对象的名称,因此这看起来像一个更通用的示例.查询本身并不重要.我想问的是:

foreach (Animal animal in sel) { /*do stuff*/ }
Run Code Online (Sandbox Code Playgroud)
  1. 我注意到,如果我使用IEnumerable,当我调试并检查"sel"时,在这种情况下是IEnumerable,它有一些有趣的成员:"inner","outer","innerKeySelector"和"outerKeySelector",这些最后2个出现成为代表."内部"成员中没有"Animal"实例,而是"Species"实例,这对我来说非常奇怪."外部"成员确实包含"Animal"实例.我假设两位代表确定哪些进入,哪些进出?

  2. 我注意到如果我使用"Distinct","inner"包含6个项目(这是不正确的,因为只有2个是Distinct),但"outer"确实包含正确的值.同样,委托方法可能决定了这一点,但这比我对IEnumerable的了解要多一些.

  3. 最重要的是,两种选择中的哪一种是性能最佳的?

邪恶的名单转换通过.ToList()

或者直接使用枚举器?

如果可以,请解释一下或抛出一些解释IEnumerable使用的链接.

c# linq ienumerable list

634
推荐指数
10
解决办法
42万
查看次数

410
推荐指数
10
解决办法
17万
查看次数

我误解了LINQ to SQL .AsEnumerable()?

考虑以下代码:

var query = db.Table
              .Where(t => SomeCondition(t))
              .AsEnumerable();

int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Run Code Online (Sandbox Code Playgroud)

假设query需要很长时间才能运行.我需要获得记录数,总数SomeNumber已经返回,并在结束时取平均值.我以为根据我读的是.AsEnumerable()将执行使用LINQ到SQL,然后使用LINQ到对象的查询Count,Sum以及Average.相反,当我在LINQPad中执行此操作时,我看到相同的查询运行三次.如果我更换.AsEnumerable().ToList(),它只被查询一次.

我错过了什么AsEnumerable/做什么?

.net c# linq linq-to-sql

49
推荐指数
3
解决办法
1万
查看次数

List,IList,IEnumerable,IQueryable,ICollection,哪个是最灵活的返回类型?

我之前在这里发过这个问题但是我不满意我理解完整的后果.问题是返回类型应该是使用linq-to-sql的数据层返回以获得最大的灵活性和查询能力.这是我读过/发现的内容:

  1. IEnumerable是有限的,只允许读取转发操作.IEnumerable是最通用的.我发现IEnumerable确实允许查询操作与扩展语法.

  2. 由于插入操作,List允许最大的灵活性.

  3. 应使用集合而不是列表来启用只读集合.

  4. 永远不应该使用IQueryable,它应该"使用和关闭".IQueryable不返回列表,但为数据库生成查询语法.

我觉得我对折衷有更好的感觉,但仍然不确定一些事情:

  1. 为什么我会选择具体类型的界面变体?即IList或ICollection与列表或集合.我会得到什么好处?

  2. 我看到扩展操作有效,但扩展的查询语法也能正常工作吗?

  3. 有人建议我之前使用AsQueryable().但是,如果我没有连接到数据库,为什么我会这样做呢?似乎扩展方法无论如何都有效.

.net architecture collections linq-to-sql

48
推荐指数
2
解决办法
2万
查看次数

MongoDB和C#:不区分大小写的搜索

我正在使用MongoDBMongoDBC#驱动程序.

我最近发现MongoDB中的所有查询都区分大小写.如何进行不区分大小写的搜索?

我找到了一种方法:

Query.Matches(
    "FirstName", 
    BsonRegularExpression.Create(new Regex(searchKey,RegexOptions.IgnoreCase)));
Run Code Online (Sandbox Code Playgroud)

.net c# case-insensitive mongodb mongodb-.net-driver

36
推荐指数
6
解决办法
3万
查看次数

如何将新记录添加到IQueryable变量?

使用LINQ从我的数据库中查询IQueryable结果,如何向IQueryable结果添加新记录.

linq iqueryable

28
推荐指数
3
解决办法
6万
查看次数

IEnumerable与IQueryable的业务逻辑或DAL返回类型

我知道之前已经问过这些问题,我将首先列出其中一些问题(我到目前为止已经阅读过的):

正如你所看到的那样,关于这个主题的SO本身有一些很好的资源,但是有一个问题/部分的问题,我仍然不确定是否已经阅读了这些内容.

我主要关注IEnumerable和IQueryable问题,更具体地说是DAL与它的消费者之间的耦合.

我发现有关两个接口的建议各不相同,这两个接口都很棒.但是,我关注的是DAL返回IQueryable的含义.据我了解,IQueryable建议/暗示有一个Linq提供商.这是第一个问题 - 如果DAL突然需要来自非Linq提供的数据源,该怎么办?以下方法可行,但它更像是黑客攻击吗?

public static IQueryable<Product> GetAll()
{
    // this function used to use a L2S context or similar to return data 
    // from a database, however, now it uses a non linq provider

    // simulate the non linq provider...
    List<Product> results = new …
Run Code Online (Sandbox Code Playgroud)

c# data-access-layer .net-4.0 visual-studio-2010

24
推荐指数
1
解决办法
4214
查看次数

将IQueryable linq查询转换为IEnumerable <T>取消linq优化的工作方式?

我在.NET上有点新手,我想知道linq是如何工作的,因为你可以一个接一个地使用许多linq查询,但是在用于传输信息或转换为列表之前,它们都没有真正执行,等
有2种重要的方法来获得一个LINQ查询,通过使用IQueryable<T>其获得的所有记录,然后将其与他们对记忆工作,这直接aplies在SQL中,其中过滤器,和IEnumerable.但是,让我们来看看这段代码:

            //Linq dynamic library
            IQueryable<Table> myResult = db.Categories
                .Where(a => a.Name.Contains(StringName))
                .OrderBy("Name")
                .Skip(0)
                .Take(10);

            if (myResult != null)
            {
                return myResult.AsEnumerable();
            } 
            else
            { return null; }
Run Code Online (Sandbox Code Playgroud)

我正在使用Linq动态库,这个查询的直接结果是IQueryable<T>,如果查询最终被返回IEnumerable,是否真的在sql上过滤了查询?还是在记忆中?

c# linq performance

20
推荐指数
2
解决办法
2万
查看次数

IEnumerable <T>和IQueryable <T>澄清?

看完这个问题后,我需要澄清一些事情.

IQueryable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;

IEnumerable<Customer> custs = from c in db.Customers
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)

问题:

1)可以这么说:在第一个查询中,SQLServer正在运行整个操作,包括where子句,返回相关的行 - 而第二个查询SELECT *...并将所有 行返回 到C#和THEN过滤器?

2)如果我只有一个集合 - 在记忆中怎么样?(var lstMyPerson = new List<MyPerson>())

IQueryable<MyPerson> lst = from c in lstMyPerson 
where c.City == "<City>"
select c;
Run Code Online (Sandbox Code Playgroud)

VS

IEnumerable<MyPerson> custs = from c in lstMyPerson 
where c.City == "<City>"
select c; …
Run Code Online (Sandbox Code Playgroud)

.net c# ienumerable iqueryable

16
推荐指数
1
解决办法
2724
查看次数

实现IQueryable包装器来转换结果对象

更新2013-08-22:

看了"建立一个IQueryable提供者系列"(感谢链接!)后,我进一步了解了一下.我相应地更新了代码.它仍然没有完全工作.如果我正确理解了教程,GetEnumerator则在请求多个元素的情况下调用(例如,通过ToList()调用queryable或任何聚合函数).所以GetEnumerator包装器的所有实现都要Execute在提供者上调用一个并传递可查询的表达式.在另一种情况下,如果只请求一个元素,Execute则直接调用.queryable的表达式还反映了它是单个元素还是多个元素.它是否正确?

不幸的是,现在我在调用源查询提供程序时得到一个InvalidOperationException,说"Sequence包含多个元素"Execute.这是什么意思?我只是传递表达式而没有任何翻译,因为如上所述涉及相同的类型.IEnumerable代码中的翻译位可能不完整,但是现在我甚至没有达到这一点.


我正在尝试使用单个底层IQueryable作为数据源来实现一个简单的IQueryable包装器,该数据源为每个结果对象调用转换函数.

我认为这将是相对微不足道的,因为包装器唯一要做的就是翻译.但是我无法让我的实现工作.

请看下面我到目前为止所得到的内容.对于某些查询,它正在工作,但我在某些时候收到StackOverflowException InvalidOperationException.我想这是因为我的queryable和我的查询提供程序之间的循环关联.但我不明白如何正确实现这一点.

在这里我的问题和想法:

1.为什么IQueryable有一个Provider又可以再次返回IQueryable?这不是要求无休止的递归吗?

2.为什么不能实现IEnumerator?为什么FirstOrDefault不使用枚举器来获取元素?当我调试应用程序时GetEnumerator()没有被我的可查询器上的FirstOrDefault()调用.

3.由于在每种情况下都没有使用枚举器,因此调用翻译函数的正确位置在哪里?QueryProvider的Execute-methods似乎是正确的地方.但在某些情况下,我仍然需要在枚举器中进行翻译调用吗? 更新:我知道我意识到我需要提供自己的IEnumerable实现,TranslatingEnumerator并从我的Execute方法返回这个枚举.为了获得枚举器GetEnumerator调用Execute(见下文).请求枚举器的LINQ代码似乎确保表达式实际返回一个IEnumerable.

关于代码的一些附注:

  • 翻译源类型名为TDatabaseEntity,翻译目标类型名为TBusinessEntity.

  • 我基本上提供了一个IQueryable,它从基础IQueryable中获取结果对象,并将它们转换为TBusinessEntity 类型 对象.

  • 我知道表达式也需要翻译.但是我将它放在一边,因为在我的实际应用程序中,我使用相同类型的TBusinessEntity和TDatabaseEntity,因此Expression可以直接传递.

  • 尽管属性相同,但结果对象仍然需要转换为其他实例.更新:我的翻译层已经在我的应用程序中工作,并且还负责相关实体.它只是'实现一个IQueryable包装'的东西,我坚持.

  • 我担心整个实现都是错误的 - 代码中的TODO只是我自己的注释.

背景:我在我的数据访问层中实现了自己从DbContext接收的实体的分离,以防止我的业务层与实际实体联系 - 由于EF和其他要求的一些错误,我不能直接使用EF分离实体.

谢谢你的帮助!

IQueryable实现

internal class TranslatingQueryable<TDatabaseEntity, TBusinessEntity> : IQueryable<TBusinessEntity>
{
    private readonly IQueryProvider _provider;
    private readonly IQueryable<TDatabaseEntity> _source; …
Run Code Online (Sandbox Code Playgroud)

.net c# linq entity-framework iqueryable

16
推荐指数
1
解决办法
8631
查看次数