标签: iqueryable

将数据集转换为IQueryable <T>或IEnumerable <T>

由于还没有Linq to DB2(来自IBM!),并且我想在我的代码中处理IQueryables或IEnumerables,我如何将DataTable转换为IQueryable?还是IEnumerable?

我有一个接口和一个匹配数据表中的列的类...

IQueryable<IMyData> GetAS400Data(..parameters..)
{
    DataSet d = GetData();
    ...
    //Some code to convert d to IQueryable<IMyData>
}
Run Code Online (Sandbox Code Playgroud)

DataTable.Rows不支持.AsQueryable,因为MSFT猛拉它,所以我不知道该怎么做.

linq datatable ienumerable iqueryable

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

算在LINQ中选择VS - 哪个更快?

IQueryable<T>在我的应用程序中使用接口,并推迟在DB上执行SQL,直到像这样的方法.ToList()

我有时需要找到某些列表的计数 - 而不需要使用列表中的数据进行计数.根据我的SQL经验,我知道SQL COUNT()的工作量远远少于返回所有行的等效SELECT语句.

所以我的问题是:不会是在DB工作少,从返回计数IQueryable<T>Count()不是呈现方法IQueryable<T>到列表并调用列表的Count()方法是什么?

我怀疑它将会ToList()激活SELECT sql,然后在单独的查询中计算行数.我希望Count()IQueryable<T>简单地为sql COUNT()查询呈现sql.但我不确定.你知道吗?

sql linq performance iqueryable

11
推荐指数
1
解决办法
4724
查看次数

C#,Linq2Sql:是否可以将两个可查询连接成一个?

我有一个可查询的,我已经使用各种WhereWhereBetween语句来缩小收集到一组特定的.现在我需要添加一种Where || WhereBetween.换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And.那么,我该怎么做呢?

我看到两种可能性:

  1. 从我拥有的一个查询中创建两个查询,一个使用Where,一个使用WhereBetween.然后将它们连接起来.不知道这是否可能?此外,虽然不是在我的特定情况下,你很可能最终会重复...
  2. 以某种方式合并Where表达式和在WhereBetween某种Or中创建的表达式.

首先,如上所述,我不确定是否可能.如果是的话,我不太确定这是一个很好的方法.

第二,我可以看到一个选项,但不完全确定所有的细节.以下是WhereBetween我的另一个问题的方法,我现在使用它并且效果很好:

    public static IQueryable<TSource> WhereBetween<TSource, TValue>(
        this IQueryable<TSource> source,
        Expression<Func<TSource, TValue>> selector,
        IEnumerable<Range<TValue>> ranges)
    {
        var param = Expression.Parameter(typeof(TSource), "x");
        var member = Expression.Invoke(selector, param);
        Expression body = null;
        foreach (var range in ranges)
        {
            var filter = Expression.AndAlso(
                Expression.GreaterThanOrEqual(member,
                     Expression.Constant(range.A, typeof(TValue))),
                Expression.LessThanOrEqual(member,
                     Expression.Constant(range.B, typeof(TValue))));
            body = body …
Run Code Online (Sandbox Code Playgroud)

c# lambda iqueryable expression-trees linq-to-sql

11
推荐指数
1
解决办法
3923
查看次数

存储库是否应将IQueryable暴露给服务层或在实现中执行过滤?

我正在尝试在我的MVC应用程序中决定数据访问的最佳模式.目前,在遵循MVC店面系列之后,我正在使用存储库,将IQueryable暴露给服务层,然后服务层应用过滤器.最初我一直在使用LINQtoSQL

public interface IMyRepository
{
  IQueryable<MyClass> GetAll();
}
Run Code Online (Sandbox Code Playgroud)

实施于:

public class LINQtoSQLRepository : IMyRepository
{
   public IQueryable<MyClass> GetAll()
   {
      return from table in dbContext.table
             select new MyClass
             {
                Field1 = table.field1,
                ... etc.
             }
   }
}
Run Code Online (Sandbox Code Playgroud)

过滤ID:

public static class TableFilters 
{       
   public static MyClass WithID(this IQueryable<MyClass> qry, string id)
   {
      return (from t in qry
              where t.ID == id
              select t).SingleOrDefault();
   }     
}
Run Code Online (Sandbox Code Playgroud)

从服务中调用:

public class TableService
{
   public MyClass RecordsByID(string id)
   {
      return _repository.GetAll()
                        .WithID(id);
   }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用带有LINQ …

linq-to-entities iqueryable repository-pattern linq-to-sql

11
推荐指数
1
解决办法
2297
查看次数

将IQueryable <EntityObject>转换为IQueryable <Specific>

我们正在尝试将一个实例转换IQueryable<EntityObject>为a IQueryable<SpecificEntityObject>,该SpecificEntityObject类型仅在运行时已知.

我们尝试使用下面的代码,但由于类型或名称空间"objType"不存在,因此无法编译.

var t = query.ElementType;
Type objType = typeof(IQueryable<>).MakeGenericType(t);
var typed = query.Cast<IEnumerable<objType>>();


var grouped = typed.GroupByMany(groupBy.Select(grp => grp.Expression).ToArray());
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# linq entity-framework casting iqueryable

11
推荐指数
1
解决办法
9280
查看次数

从IQueryable <T>中删除OrderBy

我有一个分页API,它返回用户请求的行,但一次只有这么多,而不是整个集合.API按设计工作,但我必须计算可用的记录总数(正确的页面计算).在API中,我使用Linq2Sql,在我最终提出请求之前,我在IQueryable上工作了很多.当我去计算时,我会调用类似于:totalRecordCount = queryable.Count();

结果SQL很有意思,但它也增加了一个不必要的Order By,这使得查询非常昂贵.

exec sp_executesql N'SELECT COUNT(*) AS [value]
FROM (
    SELECT TOP (1) NULL AS [EMPTY]
    FROM [dbo].[JournalEventsView] AS [t0]
    WHERE [t0].[DataOwnerID] = @p0
    ORDER BY [t0].[DataTimeStamp] DESC
    ) AS [t1]',N'@p0 int',@p0=1
Run Code Online (Sandbox Code Playgroud)

因为我正在使用IQueryable,所以我可以在它进入SQL服务器之前操作IQueryable.

我的问题是,如果我已经有一个带有OrderBy的IQueryable,是否可以在调用Count()之前删除该OrderBy?

喜欢:totalRecordCount = queryable.NoOrder .Count();

如果没有,没有大事.我看到很多关于OrderBy的问题,但没有涉及从Linq表达式中删除OrderBy的任何问题.

谢谢!

.net c# linq iqueryable linq-to-sql

11
推荐指数
2
解决办法
3616
查看次数

使用EF和WebAPI,如何返回ViewModel并支持IQueryable/OData?

我有一个ASP.NET WebAPI项目.我最近为我的所有数据表创建了EntityFramework实体.但我不想将我的数据层和架构公开给我的用户.如何将我的实体映射到ViewModel(automapper?)提供IQueryable返回类型,以便我的API支持OData?

OData支持查询组合和类似SQL的参数.我想我需要为查询组合部分提供某种双向翻译?这是否意味着自定义LINQ提供程序?我希望它比那更容易.

或者我应该放弃IQueryable/OData?

entity-framework iqueryable odata asp.net-web-api

11
推荐指数
2
解决办法
8061
查看次数

LINQ to Entities无法识别方法'System.String get_Item(System.String)'方法

我已经看过这里的各种解决方案,但它们似乎都不适合我,可能是因为我对这一切都太新了,而且我在黑暗中摸索了一下.在下面的代码中,对象"约会"包含一些基本的LDAP信息.从这些对象的列表中,我希望能够根据员工ID获得单个记录.我希望这里的代码足以说明.FTR,我尝试了各种配方,包括尝试使用和选择.所有都失败,上面标题中给出了错误.

IQueryable<appointment> query = null;

foreach(var record in results)
{
    BoiseStateLdapDataObject record1 = record;
    query = db.appointments.Where(x => x.student_id == record1.Values["employeeid"]);
}

if (query != null)
{
    var selectedRecord = query.SingleOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

linq entities iqueryable

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

ObjectSet包装器不使用linqToEntities子查询

为了在密集的数据库使用系统中进行访问控制,我必须实现一个对象集包装器,其中将检查AC.

主要目标是使此更改保留现有的数据库访问代码,即使用linq实现所有类的实体(数据库没有集中层).

创建的ObjectSetWrapper是这样的:

public class ObjectSetWrapper<TEntity> : IQueryable<TEntity> where TEntity : EntityObject
{
    private IQueryable<TEntity> QueryableModel;
    private ObjectSet<TEntity> ObjectSet;

    public ObjectSetWrapper(ObjectSet<TEntity> objectSetModels)
    {
        this.QueryableModel = objectSetModels;
        this.ObjectSet = objectSetModels;
    }

    public ObjectQuery<TEntity> Include(string path)
    {
        return this.ObjectSet.Include(path);
    }

    public void DeleteObject(TEntity @object)
    {
        this.ObjectSet.DeleteObject(@object);
    }

    public void AddObject(TEntity @object)
    {
        this.ObjectSet.AddObject(@object);
    }

    public IEnumerator<TEntity> GetEnumerator()
    {
        return QueryableModel.GetEnumerator();
    }

    public Type ElementType
    {
        get { return typeof(TEntity); }
    }

    public System.Linq.Expressions.Expression Expression
    {
        get { return this.QueryableModel.Expression; }
    }

    public …
Run Code Online (Sandbox Code Playgroud)

c# linq iqueryable wrapper entity-framework-4

11
推荐指数
1
解决办法
551
查看次数

结合表达式而不是在Entity Framework中使用多个查询

我有以下通用可查询(可能已经应用了选择):

IQueryable<TEntity> queryable = DBSet<TEntity>.AsQueryable();
Run Code Online (Sandbox Code Playgroud)

然后有Provider一个看起来像这样的类:

public class Provider<TEntity>
{
    public Expression<Func<TEntity, bool>> Condition { get; set; }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

Condition会每实例用以下方式进行定义:

Condition = entity => entity.Id == 3;
Run Code Online (Sandbox Code Playgroud)

现在我想选择至少由以下一个实体满足的所有Provider实例:ConditionDBSet

List<Provider> providers = [...];
var matchingProviders = providers.Where(provider => queryable.Any(provider.Condition))
Run Code Online (Sandbox Code Playgroud)

这个问题:我正在开始查询Provider列表中的每个实例.我宁愿使用单个查询来获得相同的结果.由于性能可疑,此主题尤其重要.如何使用单个查询获得相同的结果并使用Linq语句提高性能Expression Trees

c# asp.net entity-framework iqueryable expression-trees

11
推荐指数
1
解决办法
3971
查看次数