【问题标题】:How to store and then execute linq2db query?如何存储然后执行 linq2db 查询?
【发布时间】:2021-03-20 19:53:05
【问题描述】:

我对 C# 很陌生。在其他语言中,我习惯于以“准备,然后使用所需参数执行语句”的方式使用 DB,因此我可以将准备好的查询传递给函数并执行所有此类操作。 现在我正在尝试解决这个任务:在不同的上下文中从不同的数据库中获取几乎相同的结果集。就像您有带有文件元数据的“文件”表一样,在一个数据库中它确实有“file_priority”字段,而在另一个数据库中它确实有“file_description”字段等等,但大多数字段是常见的并且处理逻辑几乎相同。

所以我想在外部代码中准备查询并将其与所需的参数值一起传递给数据处理函数(或类)。

我找不到任何执行(将参数值传递给查询)linq2db 查询的示例。

==========UPD=============

好的,例如。让我们谈谈 Perl。

package main1;
use FileProcessor;

my $sth = $dbh->prepare(qq[ SELECT name, extension, file_priority FROM files WHERE file_id = ? ]);

my $processor = new FileProcessor(query => $sth);
my $file_id = $ENV{file_id};
my $file_data = $processor->get_file(id => $file_id);

package main2;
use FileProcessor;

my $sth = $dbh->prepare(qq[ SELECT name, extension, file_description FROM files WHERE file_id = ? ]); # preparing query

my $processor = new FileProcessor(query => $sth);
my $file_id = $ENV{file_id};
my $file_data = $processor->get_file(id => $file_id);

package FileProcessor;

sub new {
    my $class = shift;
    my $self = {@_};
    bless $self, $class;
}

sub get_file {
    my $self = shift;
    my %params = @_;
    $self->{query}->execute($params{$file_id}); #passing params to query
    my $file_data = $self->{query}->fetchrow_hashref; # fetching result from DB
# do something with file data
# ...
    return $file_data;
}

【问题讨论】:

  • 不清楚您到底在寻找什么。你能为你想做的事情提供一个尝试吗?和/或也许提供一个 SQL 示例来解释您希望它如何可重用?
  • 查看编辑后的帖子。

标签: c# .net-core linq2db


【解决方案1】:

linq2db 不会给你准备步骤。但是你可以通过很多扩展来运行原始查询:

db.Query<File>("SELECT name, extension, file_priority FROM files WHERE file_id = @fileid", 
   new DataPamater("@fileid", id));
db.Query<File>("SELECT name, extension, file_priority FROM files WHERE file_id = @fileid", 
   new { fileid = id });

linq2db 这样做并不典型,因为它支持 LINQ 查询并且会自动创建参数:

var id = 1;
var query = 
   from f in db.GetTable<File>()
   where f.file_id = id
   select new File
   {
      name = f.name,
      extension = f.extension,
      file_priority = f.file_priority
   };

var file = query.FirstOrDefault();

【讨论】:

  • 我做了进一步的研究。 CompiledQuery.Compile() 不是我要找的吗?
  • 不,不相关。其实你为什么需要准备好的查询?
  • 我...想将查询传递给服务。从外面。该服务将使用给定的参数执行它。
  • 所以,第一个例子就是你需要的。
  • 但它是原始 SQL。如果我想要 LINQ,为什么不使用 CompiledQuery.Compile()?
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-17
  • 2016-11-04
相关资源
最近更新 更多