asp.net LINQ to Entities中的临时表

xhv8bpkk  于 2023-03-20  发布在  .NET
关注(0)|答案(4)|浏览(236)

我有一个表的用户ID是巨大的。
我有一个我想要的用户ID数组。
我有两个表,它们有一个外部用户id键。
使此信息性能明智的最佳方法是什么?
理想情况下,在SQL中,最终结果可能如下所示(如果一个表中没有用户ID,而另一个表中没有,则为空值):

userid  table1value table2value
1        null          12
5        123           null
u0sqgete

u0sqgete1#

据我所知,LINQ to Entities没有一种方法可以动态地创建临时表......我认为最接近的方法是使用LINQ to Objects的类或生成匿名类型。
或者,在存储的proc中执行此操作,将proc导入到对象上下文中,并让代码调用proc。proc可以创建临时表或任何它想要的内容。
嗯。

nom7f22z

nom7f22z2#

LINQ允许您像SQL一样连接集合(实体),因此您可以创建一些外部连接来获取数据,并且当提供给Entity Framework时,应该将其转换为相对高效的SQL语句。

var results = from u in UserDataSource
   join t1 in Table1DataSource on u.UserId = t1.UserId into gj
   from jt1 in gj.DefaultIfEmpty()
   select new {u.UserId, Table1Data = jt1 == null ? String.Empty : jt1.Data};

如果表真的很大,或者需要执行额外的处理才能获得结果,我会考虑在服务器上创建一个视图,并在代码中将其Map到Entity。你只需要过滤查看结果到你想要看到的用户ID。

6yt4nkrj

6yt4nkrj3#

去年我也遇到过同样的问题,然后当谈到性能时,而不是使用临时表来保存记录(应用程序端或服务端)O移动到LINQ to SQL并创建了一个存储过程,然后通过LINQ to stored procedure =这样的实体调用它。我的存储过程完成了所有工作,只返回我需要的记录,并且在存储过程结束时分页,这样我每次只能获得有限的数据而不是应用程序中的所有数据。
请让我知道,如果你需要任何帮助,我会给予一个代码片段了。

t30tvxxf

t30tvxxf4#

我知道这是一个老主题,LINQ to SQL现在并不流行,但它肯定仍然存在。在处理L2 S临时表问题多年之后,我偶然发现了一个替代的简单解决方案。
我直到现在才意识到这一点--当L2 S对存储的过程建模时(将它们拖到dbml中),它会将“SET FMTONLY ON”添加到SQL调用中,这将指示SQL Server仅返回元数据当proc中有一个临时表时,它不能在“format only”期间发出元数据,L2 S会抛出可怕的“无法检测到以下存储过程的返回类型”错误消息。“仅格式化"可能用于保存L2 S生成时间(当然是IDK)。
如果在临时表stored proc开始时将FMTONLY显式设置为OFF,则FMTONLY ON(L2 S发出)将被忽略,L2 S将正确导入临时表stored proc。例如:

ALTER PROCEDURE dbo.ResultViaTempTable
AS
BEGIN
    SET FMTONLY OFF -- <-- do this
    --define/fill some #tempTable
    SELECT * FROM #tempTable
END

设置FMTONLY的MS参考-https://learn.microsoft.com/en-us/sql/t-sql/statements/set-fmtonly-transact-sql?view=sql-server-ver16

相关问题