由于还没有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猛拉它,所以我不知道该怎么做.
我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.但我不确定.你知道吗?
我有一个可查询的,我已经使用各种Where和WhereBetween语句来缩小收集到一组特定的.现在我需要添加一种Where || WhereBetween.换句话说,我不能像现在一样把它们连在一起,因为它可以作为一个And.那么,我该怎么做呢?
我看到两种可能性:
Where,一个使用WhereBetween.然后将它们连接起来.不知道这是否可能?此外,虽然不是在我的特定情况下,你很可能最终会重复...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) 我正在尝试在我的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 …
我们正在尝试将一个实例转换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)
有任何想法吗?
我有一个分页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的任何问题.
谢谢!
我有一个ASP.NET WebAPI项目.我最近为我的所有数据表创建了EntityFramework实体.但我不想将我的数据层和架构公开给我的用户.如何将我的实体映射到ViewModel(automapper?)并提供IQueryable返回类型,以便我的API支持OData?
OData支持查询组合和类似SQL的参数.我想我需要为查询组合部分提供某种双向翻译?这是否意味着自定义LINQ提供程序?我希望它比那更容易.
或者我应该放弃IQueryable/OData?
我已经看过这里的各种解决方案,但它们似乎都不适合我,可能是因为我对这一切都太新了,而且我在黑暗中摸索了一下.在下面的代码中,对象"约会"包含一些基本的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) 为了在密集的数据库使用系统中进行访问控制,我必须实现一个对象集包装器,其中将检查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) 我有以下通用可查询(可能已经应用了选择):
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?
iqueryable ×10
linq ×6
c# ×5
linq-to-sql ×3
.net ×1
asp.net ×1
casting ×1
datatable ×1
entities ×1
ienumerable ×1
lambda ×1
odata ×1
performance ×1
sql ×1
wrapper ×1