我可以发誓已经为Queryable类构建了一个我无法找到的扩展方法,但也许我正在考虑一些不同的东西.
我正在寻找以下内容:
IQueryable<Entity> en = from e in IDB.Entities select e;
en.ForEach(foo => foo.Status = "Complete");
Run Code Online (Sandbox Code Playgroud)
en.Foreach()必不可少:
foreach(Entity foo in en){
foo.Status = "Complete";
}
Run Code Online (Sandbox Code Playgroud)
这已经写好了吗?如果没有,是否可以编写所述扩展方法,最好允许该表上的任何LINQ表和任何字段.哪里是一个好的起点?
我知道协方差,而且我知道一般来说,直到v4.0才能在C#中实现.
但是我想知道一个具体的案例.有没有得到转换的一些方法IQueryable<Derived>,以IQueryable<Base>通过某种方式创建一个包装类,实际上并不执行查询,但是实际上可以"通过"一个.Where<>()电话吗?
我的用例是我正在尝试处理具有许多类似表的数据库模式.大多数字段都是共同的,需要在每个表上查询许多常见字段.我正在使用LinqToSql.我希望避免重复每个表的所有查询.
问候,我在使用Linq to Entities获得的IQueryable对象的Where子句扩展方法中使用bool操作时遇到了一些问题.第一个例子显示了使用Bool1作为我需要移动到where子句扩展方法的操作.第二个例子是改变后不起作用的.Bool1完全被忽略,不会影响结果.
例1:
var results =
from a in context.aTable1
where a.Bool1 == false && a.Bool2 == false
select new
{
Column1 = a.Column1
Bool1 = a.Bool1
Bool2 = a.Bool2
};
results.Where(l => l. Column1.Contains(fooString));
Run Code Online (Sandbox Code Playgroud)
例2:
var results =
from a in context.aTable1
where a.Bool2 == false
select new
{
Column1 = a.Column1
Bool1 = a.Bool1
Bool2 = a.Bool2
};
results.Where(l => l.Bool1 == false);
results.Where(l => l. Column1.Contains(fooString));
Run Code Online (Sandbox Code Playgroud)
这些都是简化的例子,但我希望它们能说明我想要做的事情.where扩展方法在不同的方法中,并且是我在创建原始查询时无法完成的原因.
我尝试了以下其他方式与where子句做同样的事情:
results.Where(l => !l.Bool1);
results.Where(l => l.Bool1.Equals(false));
Run Code Online (Sandbox Code Playgroud)
它们具有相同的效果,但没有任何效果.
我有一个简单的(混淆的)类:
public Thing ()
{
public IList<string> Strings()
{
// returns an IList of whatever,
// using strings as an example
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中的其他地方我IQueryable<Thing> things从数据库中检索一个
我的目标是将所有strings从一个things变为一个IQueryable<string> strings,可能是这样的:
var strings = from t in things
select t.Strings()
Run Code Online (Sandbox Code Playgroud)
但那只能让我受益匪浅IQueryable<IList<string>>.如何将所有这些列表整合到一个无所不包的集合中?
附:
var q1 = (IQueryable<T>).....;
var q2 = (IQueryable<T>).....;
var q3 = (IQueryable<T>).....;
var qList = new List<IQueryable<T>>{q1, q2, q3};
Run Code Online (Sandbox Code Playgroud)
我想做这个:
var q = q1.Union(q2).Union(q3);
Run Code Online (Sandbox Code Playgroud)
但使用qList而不是使用q1,q2和q3.我尝试过,qList.SelectMany但行为是不同的(可查询是对数据库SelectMany的查询,并为每个可查询而不是只查询一个查询).
我有以下几点:
IQueryable<ViewAccountEntry> viewAccountEntries = db.AccountEntries
.Where(x => x.DEntryID == 0)
.Select(x => new ViewAccountEntry()
{
AccountEntry = x,
DAccountEntries = db.AccountEntries
.Where(y => y.DEntryID == 0
&& y.Amount == -x.Amount
&& y.DateEntry == x.DateEntry)
.ToList()
});
Pages = new PageInfo(viewAccountEntries.Count(), page);
ViewAccountEntries = viewAccountEntries
.OrderBy(x => x.AccountEntry.DateEntry)
.Skip(Pages.ItemsSkipped)
.Take(Pages.ItemsPerPage)
.ToList();
Run Code Online (Sandbox Code Playgroud)
在第Select()一个对象内部创建一个包含第二个列表的对象。
当.Count()被执行时,它执行获取第二的Select?还是知道它既不需要执行也不算聪明Select?
我习惯了 .Net 和 LINQtoEntities,尤其是 IQueryable 部分,它允许在获取结果之前通过不同的函数来承载请求。
弹簧数据中是否存在这样的东西?或任何其他 java ORM ?
我希望能够做的基本示例:
private IQueryable<Todo> GetAll(){
context.Todos.Where(t => !t.Deleted);
}
public IEnumerable<Todo> GetDoneTodos(){
GetAll().Where(t => t.Done).ToList();
}
Run Code Online (Sandbox Code Playgroud) 如果IQueryable接口在服务器中执行查询表达式而不是获取所有记录IEnumerable,那么为什么IQueryable不替换IEnumerable它可以更快更高效的位置呢?
DBSet<T>有两种Where(IQueryable和IEnumerable).有没有办法调用该IEnumerable版本,因为IQueryable默认情况下调用该版本而不调用ToList()?
在EF6中,我习惯于这样做:
var orders = GetAllEntities().Include(x => x.Contact.User);
if (includeProducts)
{
orders = orders.Include(x => x.ProductOrders.Select(y => y.RentStockOrders));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Product));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Currency));
orders = orders.Include(x => x.ProductOrders.Select(y => y.Coupons));
orders = orders.Include(x => x.AdditionalCosts);
orders = orders.Include(x => x.Partner);
orders = orders.Include(x => x.OrderCoupons.Select(y => y.Coupon.Partner));
if (includeStock)
{
orders = orders.Include(x => x.ProductOrders.Select(y => y.RentStockOrders.Select(z => z.Stock)));
}
}
if (includeInvoices)
{
orders = orders.Include(x => x.Invoices.Select(y => y.Attachments));
} …Run Code Online (Sandbox Code Playgroud) 我一直试图将在我的应用程序中执行很多的查询转换为已编译的查询,但没有成功。我将其归结为一个简单的查询,因此得出结论,我一定误会了某些东西是如何工作的。
这是不使用编译查询的简单示例查询(可行):
private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
(Entities context) =>
from au in context.Users select au;
Run Code Online (Sandbox Code Playgroud)
添加编译查询调用后:
private static Func<Entities, int, string, IQueryable<Users>> _getUsers =
EF.CompileQuery((Entities context) =>
from au in context.Users select au);
Run Code Online (Sandbox Code Playgroud)
我得到这个例外:
无法将类型'System.Func>'隐式转换为'System.Func>'。存在显式转换(您是否缺少演员表?)
对于我的一生,我无法弄清楚自己在做什么错...任何建议?
iqueryable ×10
c# ×8
linq ×7
.net ×2
.net-3.5 ×1
covariance ×1
ef-core-2.1 ×1
ienumerable ×1
java ×1
linq-to-sql ×1
spring ×1
spring-data ×1