我有两个表需要通过LINQ加入,但它们存在于不同的数据库中.现在我正在返回一个表的结果,然后循环并检索另一个表的结果,你可以猜测它并不是非常有效.有没有办法让它们成为一个LINQ语句?有没有其他方法来构建它以避免循环?我只是在寻找想法,万一我忽略了什么.
请注意,我无法更改数据库,即我无法在引用另一个的视图中创建视图.我还没有尝试过的东西是在引用两个表的第三个数据库中创建视图.欢迎任何想法.
我们发现编译Linq查询比每次编译要快得多,所以我们想开始使用编译查询.问题是它使代码更难阅读,因为查询的实际语法在某些其他文件中是关闭的,远离它的使用位置.
在我看来,有可能编写一个方法(或扩展方法),它使用反射来确定传入的查询,并自动缓存已编译的版本以供将来使用.
var foo = (from f in db.Foo where f.ix == bar select f).Cached();
Run Code Online (Sandbox Code Playgroud)
Cached()必须反映传入的查询对象并确定所选的表和查询的参数类型.显然,反射有点慢,因此使用缓存对象的名称可能会更好(但是第一次编译查询时仍然需要使用反射).
var foo = (from f in db.Foo where f.ix == bar select f).Cached("Foo.ix");
Run Code Online (Sandbox Code Playgroud)
有没有人有这方面的经验,或者知道它是否可能?
更新:对于那些没有看过它的人,可以使用以下代码将LINQ查询编译为SQL:
public static class MyCompiledQueries
{
public static Func<DataContext, int, IQueryable<Foo>> getFoo =
CompiledQuery.Compile(
(DataContext db, int ixFoo) => (from f in db.Foo
where f.ix == ixFoo
select f)
);
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是拥有这些Func<>对象的缓存,我可以在第一次自动编译查询后调用它们.
CSharpSamples.zip中Dynamic Linq附带的帮助文件未显示使用contains或like的任何示例.
这样做有什么简单的解决方法吗?即哪里(像@col这样的col)不起作用.
我想在a中显示客户的会计历史记录DataGridView,我希望有一个列显示其余额的运行总计.我这样做的旧方法是获取数据,循环数据,逐行添加行DataGridView并计算当时的运行总数.瘸.我宁愿使用LINQ to SQL,或LINQ如果不能使用LINQ to SQL,来计算运行总数,这样我就可以设置DataGridView.DataSource为我的数据.
这是我正在拍摄的一个超级简化的例子.说我有以下课程.
class Item
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
public decimal RunningTotal { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要一个可以生成如下结果的L2S或LINQ语句:
Date Amount RunningTotal
12-01-2009 5 5
12-02-2009 -5 0
12-02-2009 10 10
12-03-2009 5 15
12-04-2009 -15 0
Run Code Online (Sandbox Code Playgroud)
请注意,可能有多个具有相同日期的项目(12-02-2009).在计算运行总计之前,应按日期对结果进行排序.我猜这意味着我需要两个语句,一个用于获取数据并对其进行排序,另一个用于执行运行总计算.
我希望Aggregate能做到这一点,但它并不像我希望的那样有效.或者也许我只是想不出来.
这个问题似乎跟我想要的一样,但我不知道接受/唯一的答案是如何解决我的问题的.
关于如何解决这个问题的任何想法?
编辑 结合Alex和DOK的答案,这就是我最终得到的结果:
decimal runningTotal = 0;
var results = FetchDataFromDatabase()
.OrderBy(item => item.Date)
.Select(item => new …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚是否有办法检索在数据库服务器上执行的(完整)sql语句.
我已经发现了一些东西,但它并不是我想要的东西:
IQueryable<SomeType> someQuery = ...
string command = dataContext.GetCommand(query).CommandText;
Run Code Online (Sandbox Code Playgroud)
在我的情况下,这给了我一个命令字符串,如:
SELECT TOP (50) [t0].[ID], ....
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0))
Run Code Online (Sandbox Code Playgroud)
在数据库上执行:
exec sp_executesql N'SELECT TOP (50) [t0].[ID], ...
FROM [dbo].[someTable] AS [t0]
WHERE ([t0].[someColumn] IS NOT NULL) AND (([t0].[someColumn]) IN (@p0, @p1))',N'@p0 int,@p1 int',@p0=401,@p1=201
Run Code Online (Sandbox Code Playgroud)
有没有办法从C#代码中检索这个"完整"语句(以及参数值)?
我想LinqDataSource在页面上使用控件并限制返回的记录数量.我知道如果我使用代码,我可以做这样的事情:
IEnumerable<int> values = Enumerable.Range(0, 10);
IEnumerable<int> take3 = values.Take(3);
Run Code Online (Sandbox Code Playgroud)
有人知道LinqDataSource控件是否可以这样吗?
[更新]
我将使用LinqDataSource与ListView控制,不是一个GridView或Repeater.该LinqDataSource向导不提供限制返回记录数的功能."高级"选项仅允许您启用删除,插入和更新.
以下适用于IEnumerable类型,但有没有办法得到这样的东西使用IQueryable类型对sql数据库?
class Program
{
static void Main(string[] args)
{
var items = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
foreach (var item in items.Where(i => i.Between(2, 6)))
Console.WriteLine(item);
}
}
static class Ext
{
public static bool Between<T>(this T source, T low, T high) where T : IComparable
{
return source.CompareTo(low) >= 0 && source.CompareTo(high) <= 0;
}
}
Run Code Online (Sandbox Code Playgroud) 考虑一个用于存储审计事件的SQL Server表.
需要的是只获得每个CustID的最新条目.我们想要获得整个对象/行.我假设在查询中需要GroupBy().这是迄今为止的查询:
var custsLastAccess = db.CustAccesses
.Where(c.AccessReason.Length>0)
.GroupBy(c => c.CustID)
// .Select()
.ToList();
// (?) where to put the c.Max(cu=>cu.AccessDate)
Run Code Online (Sandbox Code Playgroud)

问题:
如何创建查询以选择每个的最新(最大AccessDate)记录/对象CustID?
我尝试在当前日期的60天30天20天内选择数据库中的记录.
请在下面查看此查询.
var uploads = (
from files in _fileuploadRepository.Table
join product in _productRepository.Table on files.Event equals product.Id
where
(
product.EventDate != null &&
(product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) ||
(product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20))
&&
files.IsSkiped == false
select files;
).ToList();
Run Code Online (Sandbox Code Playgroud)
但是此查询发生错误.

我很无能为力.请帮忙.
我们刚刚开始在我们的DAL中使用LINQ to SQL,我们还没有真正提出缓存模型的标准.以前我们使用的是一个基础'DAL'类,它实现了我们所有DAL类继承的缓存管理器属性,但现在我们没有.我想知道是否有人提出了一种缓存LINQ to SQL结果的"标准"方法?
我们正在网络环境(IIS)中工作,如果这有所作为.我知道这可能最终成为一个主观问题,但我仍然认为这些信息很有价值.
编辑:为了澄清,我不是在讨论缓存单个结果,我更多的是一个架构解决方案,就像你如何设置缓存一样,以便所有的链接方法都使用相同的缓存架构.
linq-to-sql ×10
linq ×8
c# ×6
.net ×2
asp.net ×1
asp.net-mvc ×1
caching ×1
database ×1
dynamic ×1
group-by ×1
iis ×1
iqueryable ×1
sql ×1